1

我目前正在尝试通过使用 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.B 之前设置/填充 person.A 和 person.C 属性,但是我很难测试/调试它来验证我的假设。

我已经在所有三个属性上添加了一个并行监视,但是通过调试对我来说并不能说明问题。

如果我正在填充一个主对象,这也是我优化对方法的多个调用的正确方法吗?

就我而言,我有 5-7 种不同的方法来收集数据,我想让它们并行,因为其中一些相对耗时。

4

2 回答 2

4

原则上依赖时间是错误的,因为时间永远无法保证,尤其是在真实条件下。如果您需要确保任务已完成,您应该对任务应用适当的等待。或者使用 C# 5.0 async-await 或延续。

简而言之,不要巧合地编程。通过构造使您的程序正确。

于 2013-05-04T19:36:01.007 回答
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;   
于 2013-05-07T17:39:01.190 回答