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

为什么会发生这种情况?

c# .net 4并行编程

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之前启动这两个任务。