任务工厂执行功能Sequnetialy

时间:2016-04-12 19:57:40

标签: c# task-parallel-library

在使用Parallel库时,我遇到了Task Factory的意外结果。

  

假设:任务工厂将随机处理呼叫

     

结果:每次都是顺序处理(无论是相同的功能还是不同的功能)

    static void Do(string test)
    {
        Console.WriteLine("testttttt " + test);
    }

    static void Main(string[] args)
    {
        Task.Factory.StartNew(() =>
        {
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
        });
        Console.ReadKey();
    }

enter image description here

以下代码会产生随机结果:

        Task.Factory.StartNew(() =>
        {
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
        });
        Task.Factory.StartNew(() =>
        {
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
        });
        Task.Factory.StartNew(() =>
        {
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
        });

enter image description here

为什么第一个例子总是产生连续的结果,并且这应该被认为是理所当然的所有时间?

2 个答案:

答案 0 :(得分:5)

第一个示例创建一个任务。由于任务使用单个线程,因此单个任务中的代码将按顺序执行。

第二个示例创建了3个任务。每个任务中的代码将按顺序执行。但是在不同的任务之间,你会得到随机的"行为。

答案 1 :(得分:3)

在第一个示例中,您在线程池线程中调用一个同步方法,并将该同步方法的执行结果异步显示给Task.Factory.StartNew的调用方。该方法本身只是一种同步方法,并将相应地运行。由于该方法是同步的,并且操作都是从单个线程运行的,因此它们按顺序运行是由C#保证的。

当您启动多个任务而不等待之前的任务完成时,则无法保证这些操作的顺序(除非这些操作中的代码明确地彼此同步)。