我正在读亚当·弗里曼写的一本书,名为《C#中的专业.NET 4并行编程》。在第2章第13页中,它讨论了通过使用task1.Result
等待返回结果来使用Task<int>
返回结果。我不明白为什么task2
要等task1
完成。它们在不同的线程上。
类似于下面的内容:
Task<int> task1 = new Task<int>(() => { ... ; return sum });
task1.Start();
Console.WriteLine("Result 1: {0}", task1.Result);
Task<int> task2 = new Task<int>(() => { ... ; return sum });
task2.Start();
Console.WriteLine("Result 2: {0}", task2.Result);
如果我移到下面的行到底部,似乎无论我尝试了多少次,task1
仍然是第一个执行的。
Console.WriteLine("Result 1: {0}", task1.Result);
为什么会发生这种情况?
发布于 2012-01-02 22:46:14
实际上最先完成的任务--也就是最先命中其返回语句的任务--在形式上是不可预测的。他们可以在你接受他们的结果之前完成他们的工作。
如果您的示例任务所做的工作量不是很大,那么即使您不接受它的结果(或者在Java线程行话中,加入它),task1也将首先完成。那是因为是你先开始的。
您大概知道task1是第一个完成的。您的任务代码中是否隐藏了Console.WriteLine?如果是这样,请记住,控制台子系统会序列化操作,因此第一个使用它的任务将在第二个任务开始之前完成。这样想吧:你的两个任务竞争到控制台,胜利者通吃。
task1在这场竞赛中占据了不公平的优势,因为它甚至在主线程开始用第二个new
构造task2之前就已经关闭并运行了。
发布于 2012-01-02 22:34:57
在Task
完成之前,Task.Result
将一直处于阻塞状态。
它必须这样做,才能返回结果!
因此,在您的第一个示例中,在task1
完成之前甚至都不会启动task2
。
如果将task1.Result
移到底部,则不能确定哪个任务首先完成,但您的Console.WriteLine
语句将按顺序执行。
发布于 2012-01-02 22:46:41
尝试使用task.Wait()方法。
Task<int> task1 = new Task<int>(() => { int sum = 0; return sum; });
task1.Start();
task1.Wait();
Console.WriteLine("Result 1: {0}", task1.Result);
Task<int> task2 = new Task<int>(() => { int sum = Enumerable.Range(1, 10).Sum(); return sum; });
task2.Start();
task1.Wait();
Console.WriteLine("Result 2: {0}", task2.Result);
https://stackoverflow.com/questions/8702032
复制相似问题