首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#.net 4并行编程

C#.net 4并行编程
EN

Stack Overflow用户
提问于 2012-01-02 22:32:32
回答 5查看 521关注 0票数 2

我正在读亚当·弗里曼写的一本书,名为《C#中的专业.NET 4并行编程》。在第2章第13页中,它讨论了通过使用task1.Result等待返回结果来使用Task<int>返回结果。我不明白为什么task2要等task1完成。它们在不同的线程上。

类似于下面的内容:

代码语言:javascript
运行
复制
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仍然是第一个执行的。

代码语言:javascript
运行
复制
Console.WriteLine("Result 1: {0}", task1.Result);

为什么会发生这种情况?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-02 22:46:14

实际上最先完成的任务--也就是最先命中其返回语句的任务--在形式上是不可预测的。他们可以在你接受他们的结果之前完成他们的工作。

如果您的示例任务所做的工作量不是很大,那么即使您不接受它的结果(或者在Java线程行话中,加入它),task1也将首先完成。那是因为是你先开始的。

您大概知道task1是第一个完成的。您的任务代码中是否隐藏了Console.WriteLine?如果是这样,请记住,控制台子系统会序列化操作,因此第一个使用它的任务将在第二个任务开始之前完成。这样想吧:你的两个任务竞争到控制台,胜利者通吃。

task1在这场竞赛中占据了不公平的优势,因为它甚至在主线程开始用第二个new构造task2之前就已经关闭并运行了。

票数 0
EN

Stack Overflow用户

发布于 2012-01-02 22:34:57

Task完成之前,Task.Result将一直处于阻塞状态。

它必须这样做,才能返回结果!

因此,在您的第一个示例中,在task1完成之前甚至都不会启动task2

如果将task1.Result移到底部,则不能确定哪个任务首先完成,但您的Console.WriteLine语句将按顺序执行。

票数 3
EN

Stack Overflow用户

发布于 2012-01-02 22:46:41

尝试使用task.Wait()方法。

代码语言:javascript
运行
复制
        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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8702032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档