C# 任务工厂按顺序执行功能

C# 任务工厂按顺序执行功能,c#,task-parallel-library,C#,Task Parallel Library,在使用并行库时,我遇到了来自任务工厂的意外结果 假设:任务工厂将随机处理调用 结果:每次顺序处理(无论是相同的功能还是不同的功能) 以下代码生成随机结果: 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");
        });
        Task.Factory.StartNew(() =>
        {
            Do("1"); Do("2"); Do("3"); Do("4"); Do("5");
        });


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

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


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

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


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

第一个示例创建了一个任务这是否意味着我应该始终假设一个任务始终绑定到一个线程!?我使用下面的行进行了测试,处理过程也按顺序进行:newtask(委托{Do(“1”);Do(“2”);Do(“3”);});我不会把它推广到所有的
任务
中,因为有些任务可以在其中创建其他任务。但对于您的情况,由于您使用的是
Task.Factory.StartNew
并提供要执行的操作,因此操作中的代码将绑定到单个线程。“因为某些任务可以在其中创建其他任务。”正确。
        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");
        });