我目前正在尝试通过在.Net 4.0中使用任务来利用并行线程来进行一些性能优化。
我已经创建了三个方法,它们返回一些对象的集合,或者只返回一个对象。让我们称它们为MethodA、MethodB和MethodC。
在MethodB内部,我有一个长时间的延迟--大约5-7秒。
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种不同的方法来收集数据,我希望将它们并行化,因为其中一些方法相对比较耗时。
发布于 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个任务:
person.A = await Task.Run(() => Mystatic.MethodA());
person.B = await Task.Run(() => Mystatic.MethodB());
person.C = await Task.Run(() => Mystatic.MethodC());
它仍然是顺序的-如果你想在某种程度上并行执行,你可以这样做:
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;
发布于 2013-05-05 03:36:01
依赖于计时原则上是有缺陷的,因为计时永远不会得到保证,特别是在真实的条件下。如果需要确保任务已完成,则应对任务应用适当的waiting。或者使用C# 5.0 async-await或continuations。
简而言之,编程不是偶然的。通过构造使你的程序正确。
https://stackoverflow.com/questions/16378139
复制相似问题