据我了解,ContinueWith方法等待相关任务完成。对于以下代码,这意味着它在完成其子任务后就完成了。如果是这样,为什么有时会输出0 0 0而有时输出0 1 2?
static void Main(string[] args)
{
Task<Int32[]> parent = Task.Run(() =>
{
var results = new Int32[3];
new Task(() => results[0] = 0, TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[1] = 1, TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[2] = 2, TaskCreationOptions.AttachedToParent).Start();
return results;
});
var finalTask = parent.ContinueWith(n =>
{
foreach (Int32 i in n.Result)
Console.WriteLine(i);
});
finalTask.Wait();
Console.ReadLine();
}
来自http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
将Action传递给Task.Run时:
Task.Run(someAction);
完全等同于:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
在我看来,这将阻止孩子按预期进行附着。
确实将起跑线更改为
Task<Int32[]> parent = Task.Factory.StartNew(() =>
确实可以解决问题。通过在http://msdn.microsoft.com/en-us/library/dd997417(v=vs.110).aspx上查看了它们的不同之处,得出了这个结论,该Factory.StartNew
方法使用而不是方法Run
。
话虽这么说,但我不确定InvalidOperationException
在尝试附加任务时为什么没有抛出一个...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句