任务工厂顺序执行函数

Task Factory Excute Functions Sequnetialy

在使用 Parallel 库时,我从 Task Factory 中遇到了意想不到的结果。

Assumption: Task Factory will process calls randomly

Result: Sequential processing every single time (whether the same function or different functions)

    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();
    }

以下代码产生随机结果:

        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");
        });

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

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

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

在您的第一个示例中,您在线程池线程中调用一个 同步 方法,并将该同步方法的执行结果异步公开给 Task.Factory.StartNew。该方法本身只是一个同步方法,因此会 运行 。由于该方法是同步的,并且操作全部 运行 来自单个线程,因此它们 运行 的顺序由 C# 保证。

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