在使用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();
}
以下代码会产生随机结果:
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");
});
为什么第一个例子总是产生连续的结果,并且这应该被认为是理所当然的所有时间?
答案 0 :(得分:5)
第一个示例创建一个任务。由于任务使用单个线程,因此单个任务中的代码将按顺序执行。
第二个示例创建了3个任务。每个任务中的代码将按顺序执行。但是在不同的任务之间,你会得到随机的"行为。
答案 1 :(得分:3)
在第一个示例中,您在线程池线程中调用一个同步方法,并将该同步方法的执行结果异步显示给Task.Factory.StartNew
的调用方。该方法本身只是一种同步方法,并将相应地运行。由于该方法是同步的,并且操作都是从单个线程运行的,因此它们按顺序运行是由C#保证的。
当您启动多个任务而不等待之前的任务完成时,则无法保证这些操作的顺序(除非这些操作中的代码明确地彼此同步)。