我目前正在尝试通过使用Tasks来利用.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.A和person.C属性在person.B之前设置/填充,但是我很难测试/调试它来验证我的假设。
我在所有三个属性上添加了一个并行监视,但调试并不能解释我的事情。
如果我填充主对象,这也是我优化多次调用方法的正确方法吗?
在我的情况下,我有5-7种不同的方法来收集数据,我想让它们并行,因为其中一些是相对耗时的。
答案 0 :(得分:4)
原则上依赖于时间错误是因为时间永远不会得到保证,特别是在真实的单词条件下。如果您需要确保已完成任务,则应对任务应用适当的等待。或者使用C#5.0 async-await或continuations。
简而言之,不要巧合。通过构建使程序正确。
答案 1 :(得分:1)
你的假设是错误的。 Task的Result
属性将有效地等待任务完成 - 因此,将按顺序分配A,B,C。此外,这将破坏创建异步任务的目的。
一种方法是你可以在所有三个任务上使用Task.WaitAll,然后将每个任务的结果分配给A,B,C
如果你有VS2012,你也可以使用async / await - 你仍然可以使用http://nuget.org/packages/Microsoft.Bcl.Async/
来定位.NET 4.0但是要明白async / await不会并行启动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;