c# .net 4并行编程
本文关键字:编程 并行 net | 更新日期: 2023-09-27 18:19:18
我正在读Adam Freeman写的《c#中的Pro . net 4并行编程》。在第2章第13页中,它讨论了使用Task<int>
通过使用task1.Result
等待它完成来返回结果。我不明白为什么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);
为什么会发生这种情况?
Task.Result
阻塞,直到Task
完成。
为了有一个返回的结果,它必须这样做!
所以,在你的第一个例子中,task2
直到task1
完成才开始。
如果您将task1.Result
移到底部,则不确定哪个任务首先完成,但您的Console.WriteLine
语句将按顺序执行。
实际首先完成的任务——即首先执行其返回语句——在形式上是不可预测的。他们可以在你接受他们的结果之前完成他们的工作。
如果您的示例任务所做的工作不是很大,那么即使您不接受它的Result(或者在Java线程术语中,加入它),task1也会首先完成。那是因为你先开始的。
假设你知道task1先完成了。有控制台吗?为您的任务隐藏在代码中的WriteLine ?如果是这样,请记住Console子系统序列化操作,因此第一个使用它的任务将在第二个任务开始之前完成。你可以这样想:你的两个任务竞相进入控制台,胜者获得一切。
task1在这场竞争中有一个不公平的优势,因为在主线程开始用第二个new
构造task2之前,它就已经关闭并运行了。
尝试使用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);
"控制台。WriteLine("Result 1: {0}", task1.Result);"不能运行,直到task1完成,所以它等待/阻塞。
当任务彼此独立运行时,调用线程调用控制台。按顺序写入。这两个任务的结果必须是有序的。
Task task1 = new Task(() => { ... ; return sum });
task1.Start();
Task task2 = new Task(() => { ... ; return sum });
task2.Start();
task1.Wait()
Console.WriteLine("Result 1: {0}", task1.Result);
task2.Wait()
Console.WriteLine("Result 2: {0}", task2.Result);
试试这个。这里需要在调用console.writeline之前启动这两个任务。