了解System.Threading.Tasks行为

时间:2013-05-04 19:29:26

标签: c# multithreading c#-4.0 task

我目前正在尝试通过使用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种不同的方法来收集数据,我想让它们并行,因为其中一些是相对耗时的。

2 个答案:

答案 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;