首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解System.Threading.Tasks行为

了解System.Threading.Tasks行为
EN

Stack Overflow用户
提问于 2013-05-05 03:29:26
回答 2查看 256关注 0票数 1

我目前正在尝试通过在.Net 4.0中使用任务来利用并行线程来进行一些性能优化。

我已经创建了三个方法,它们返回一些对象的集合,或者只返回一个对象。让我们称它们为MethodA、MethodB和MethodC。

在MethodB内部,我有一个长时间的延迟--大约5-7秒。

代码语言:javascript
运行
复制
var person = new Person();

person.A = Task.Factory.StartNew(() => Mystatic.MethodA()).Result;
person.B = Task.Factory.StartNew(() => Mystatic.MethodB()).Result;
person.C = Task.Factory.StartNew(() => Mystatic.MethodC()).Result;

现在我希望在设置/填充person.B之前设置/填充person.A和person.C属性,但我在测试/调试它以验证我的假设时遇到了困难。

我已经在所有三个属性上添加了并行监视,但是通过调试对我来说并不是很清楚。

另外,如果我要填充一个主对象,这是不是优化多个方法调用的合适方式?

在我的例子中,我有5-7种不同的方法来收集数据,我希望将它们并行化,因为其中一些方法相对比较耗时。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 01:39:01

你的假设是错误的。任务的Result属性将有效地等待任务完成-因此,将按该顺序分配A、B、C。此外,这将违背创建异步任务的目的。

一种方法是可以在所有三个任务上使用Task.WaitAll,然后将每个任务的结果分配给A、B、C

如果您有VS2012,也可以使用async/await -您仍然可以使用http://nuget.org/packages/Microsoft.Bcl.Async/作为.NET 4.0的目标

但是,请理解,如果执行以下操作,异步/等待将不会并行启动3个任务:

代码语言:javascript
运行
复制
person.A = await Task.Run(() => Mystatic.MethodA());
person.B = await Task.Run(() => Mystatic.MethodB());
person.C = await Task.Run(() => Mystatic.MethodC());

它仍然是顺序的-如果你想在某种程度上并行执行,你可以这样做:

代码语言:javascript
运行
复制
Task tA = Task.Run(() => Mystatic.MethodA());
Task tB = Task.Run(() => Mystatic.MethodB());
Task tC = Task.Run(() => Mystatic.MethodC());

person.A = await tA;
person.B = await tB;
person.C = await tC;   
票数 1
EN

Stack Overflow用户

发布于 2013-05-05 03:36:01

依赖于计时原则上是有缺陷的,因为计时永远不会得到保证,特别是在真实的条件下。如果需要确保任务已完成,则应对任务应用适当的waiting。或者使用C# 5.0 async-await或continuations。

简而言之,编程不是偶然的。通过构造使你的程序正确。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16378139

复制
相关文章

相似问题

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