< p >
Task.Run
和 TaskFactory.StartNew
的一个区别是默认情况下添加了新的 DenyChildAttach
选项。但是 AttachedToParent
是有原因的。在什么情况下会使用附加的子任务呢?
Task.Run
和 TaskFactory.StartNew
的一个区别是默认情况下添加了新的 DenyChildAttach
选项。但是 AttachedToParent
是有原因的。在什么情况下会使用附加的子任务呢?
AttachedToParent
的使用场景是当你有一个嵌套的动态任务并行性场景时。也就是说:
由于绝大多数并发问题是基于I/O的(而不是基于CPU的),绝大多数并行性场景是基于数据的并行性(而不是动态任务并行性),并且动态任务并行问题可能具有分层性质,因此几乎从不会出现此情况。
不幸的是,任务(包括异步任务)之间存在逻辑的父/子关系,这导致很多开发人员错误地尝试使用AttachedToParent
标志与async
任务一起使用。因此,引入了DenyChildAttach
标志(防止AttachedToParent
生效)。
await
。var parentTask = Task.Run(async () =>
{
await Task.Run(() => Thread.Sleep(1000));
Console.WriteLine("parent task completed");
});
但在 .Net 4.0 中,你必须对它们进行 Wait()
操作。例如:
var parentTask = Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => Thread.Sleep(1000)).Wait();
Console.WriteLine("parent task completed");
});
var parentTask = Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => Thread.Sleep(1000), TaskCreationOptions.AttachedToParent)
.ContinueWith(antecedent => Console.WriteLine("parent task completed", TaskContinuationOptions.AttachedToParent);
});
AttachedToParent
标志的任何实际用例出现了吗? - Rodion Mostovoi