Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AttachedToParent的用例是什么?_C#_Task Parallel Library - Fatal编程技术网

C# AttachedToParent的用例是什么?

C# AttachedToParent的用例是什么?,c#,task-parallel-library,C#,Task Parallel Library,Task.Run和TaskFactory.StartNew之间的区别之一是默认情况下添加了新的denychildatach选项。但是创建附加的不透明度是有原因的。在什么情况下,您希望使用附加的子任务?我能想到的唯一情况是async Wait使其过时。例如,如果您希望任务等待其子任务,您将等待它们 var parentTask = Task.Run(async () => { await Task.Run(() => Thread.Sleep(1000));

Task.Run
TaskFactory.StartNew
之间的区别之一是默认情况下添加了新的
denychildatach
选项。但是创建附加的不透明度是有原因的。在什么情况下,您希望使用附加的子任务?

我能想到的唯一情况是async Wait使其过时。例如,如果您希望任务等待其子任务,您将等待它们

var parentTask = Task.Run(async () =>
{
    await Task.Run(() => Thread.Sleep(1000));          
    Console.WriteLine("parent task completed");
});
但是在.NET4.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
的用例是当您有一个嵌套的场景时。即:

  • 您有一个并行执行的算法(即CPU代码,而不是I/O操作),
  • 算法运行时必须执行的任务会有所不同(即,在算法启动时,它不知道需要多少任务),
  • 在这些任务的完成过程中存在层次关系或父/子关系(即,在所有子任务完成之前,“父”不应被视为已完成,如果任何子任务失败/取消,则父任务也应失败/取消,即使其代码没有错误)
  • 由于绝大多数并发问题都是基于I/O的(不是基于CPU的),并且绝大多数并行场景都是基于数据的并行(不是动态任务并行),而且动态任务并行问题可能有也可能没有层次性,因此几乎从未出现过这种场景

    不幸的是,任务(包括异步任务)之间存在逻辑父子关系,这导致许多开发人员错误地尝试将
    AttachedToParent
    标志与
    async
    任务一起使用。因此,
    denychildatach
    标志的引入(防止
    AttachedToParent
    生效)