.NET Framework 4
 
其他版本
 
评价此主题
 

 

下面的示例演示一个父任务,该父任务创建一个简单的嵌套任务。

 
static void SimpleNestedTask()
{
    var parent = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Outer task executing.");

        var child = Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Nested task starting.");
            Thread.SpinWait(500000);
            Console.WriteLine("Nested task completing.");
        });
    });

    parent.Wait();
    Console.WriteLine("Outer has completed.");
}

/* Sample output:
        Outer task executing.
        Nested task starting.
        Outer has completed.
        Nested task completing.
 */


AttachedToParent 选项(如下面的示例所示),

 
var child = Task.Factory.StartNew((t) =>
{

    Console.WriteLine("Attached child starting.");
    Thread.SpinWait(5000000);
    Console.WriteLine("Attached child completing.");
},                TaskCreationOptions.AttachedToParent);


将生成以下输出。

 
Parent task executing.
Attached child starting.
Attached child completing.
Parent has completed.


AttachedToParent 选项以创建子任务。

下表列出了两种子任务的基本区别。

 

类别

嵌套任务

附加的子任务

外部任务(父任务)等待内部任务完成。

父任务传播子任务(内部任务)引发的异常。

父任务(外部任务)的状态依赖于子任务(内部的任务)的状态。

Result 属性处于阻止状态,直到其任务完成。

 
static void WaitForSimpleNestedTask()
{
    var outer = Task<int>.Factory.StartNew(() =>
    {
        Console.WriteLine("Outer task executing.");

        var nested = Task<int>.Factory.StartNew(() =>
        {
            Console.WriteLine("Nested task starting.");
            Thread.SpinWait(5000000);
            Console.WriteLine("Nested task completing.");
            return 42;
        });

        // Parent will wait for this detached child.
        return nested.Result;
    });

    Console.WriteLine("Outer has returned {0}.", outer.Result);
}

/* Sample output:
    Outer task executing.
    Nested task starting.
    Nested task completing.
    Outer has returned 42.
 */


异常处理(任务并行库)

如何:取消任务及其子级

父任务何时取消

任务取消

嵌套任务何时取消

此行为与任何顶级任务的行为相同。

等待父任务非常重要,这样,除了可以处理通过附加子任务的关系图向上传播的所有出错异常,还可以处理向上传播的所有良性异常。

异常处理(任务并行库)

相关文章:

  • 2021-09-07
  • 2021-08-12
  • 2021-10-24
  • 2021-10-18
  • 2021-10-15
  • 2022-01-02
  • 2021-11-08
  • 2021-06-14
猜你喜欢
  • 2022-01-31
  • 2021-12-29
  • 2022-12-23
  • 2019-11-05
  • 2019-11-08
  • 2022-12-23
相关资源
相似解决方案