我想了解Nested Task and Child Task
之间的区别。
var outerTask = Task.Factory.StartNew( () =>
{
var nestedTask = Task.Factory.StartNew( () =>
{
Console.WriteLine("Inside nestedTask");
});
});
A "child task" looks like this:
var parentTask = Task.Factory.StartNew( () =>
{
var childTask = Task.Factory.StartNew( () =>
{
Console.WriteLine("Inside childTask");
}, TaskCreationOptions.AttachedToParent );
});
这里我附上了代码。
似乎当我们启动任何嵌套任务时,外部任务可以在内部任务之前完成,但是在子任务的情况下总是在父任务之前完成子任务。我不确定我是对还是不对。因此,如果有人指导我何时去嵌套任务和带有示例场景的子任务,那将会很有帮助。感谢答案 0 :(得分:7)
IMO,最好的解释见Stephen Toub's blog post:
...正在创建的任务作为子进程向该父进程注册, 导致另外两个行为:父任务不会转换 到完成状态,直到所有孩子都完成, 任何有故障的孩子的例外情况都会传播到 parent Task(除非父Task在之前观察到这些异常 它完成了。)
答案 1 :(得分:5)
微软很好地解释了这一点。
嵌套任务只是在用户中创建的Task实例 代表另一项任务。子任务是一个嵌套任务 使用AttachedToParent选项创建。任务可以创建任何数字 子任务和/或嵌套任务,仅受系统资源的限制。该 以下示例显示了创建一个简单嵌套的父任务 任务。
...
关于儿童与嵌套任务的最重要的一点是 嵌套任务基本上独立于父或外 任务,而附加的子任务非常紧密地同步 父母。
http://msdn.microsoft.com/en-us/library/vstudio/dd997417%28v=vs.100%29.aspx
答案 2 :(得分:0)
简单,如果未将一个子任务附加到父任务,那么该任务失败了吗?然后,父任务状态仍为“ RanToCompletion”
var parentTask = Task.Factory.StartNew(() =>
{
var childTask = Task.Factory.StartNew(() =>
{
Console.WriteLine("Inside childTask");
}, TaskCreationOptions.AttachedToParent);
var childTask2 = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000 * 3);
throw new Exception("Bomb2");
Console.WriteLine("Inside childTask2");
}, **TaskCreationOptions.None**); // If not AttachedToParent, parentTask.Status == RanToCompletion
}).ContinueWith(t =>
{
Console.WriteLine(t.Status);
});