TaskCreationOptions.AttachedToParent不等待子任务

Mur*_*nze 5 c# async-await

根据MSDN:

您可以使用AttachedToParent选项来表达结构化任务并行性,因为父任务隐式等待所有子任务完成.

所以我有这个代码:

public async Task<int> GetIntAsync()
{
    var childTask = Task.Factory.StartNew(async () =>
    {
        await Task.Delay(1000);
    },TaskCreationOptions.AttachedToParent);

    return 1;
}

public async Task<ActionResult> Index()
{
    var watch = Stopwatch.StartNew();
    var task = GetIntAsync();
    var result = await task;
    var time = watch.ElapsedMilliseconds;

    return View();  
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么时间是0而不是1000.

And*_*ott 5

AttachedToParent 仅附加到计划的任务。异步方法返回的任务不是计划的,而是(隐式)来自 TaskCompletionSource


Ste*_*ary 5

使用基于任务的异步模式(TAP)的代码通常不使用AttachedToParent.AttachedToParent是任务并行库(TPL)设计的一部分.TPL和TAP都共享相同的Task类型,但在TAP代码中应该避免许多TPL成员.

在TAP中,通过使用"父"异步方法await从"子"异步方法返回的任务,您可以支持"父"和"子"异步方法的概念:

public async Task<int> GetIntAsync()
{
  var childTask = Task.Run(() =>
  {
    ...
    await Task.Delay(1000);
    ...
  });
  ...

  await childTask;
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

  • @drowa:“任务通常(如果不是总是)由后台线程执行”这一说法是不正确的。任务代表未来事件的完成。虽然它们“可能”可以代表在线程池(“Task.Run”)上完成的工作,但绝大多数任务代表 I/O 密集型工作并且不会在任何地方“运行”。要实现协作关闭,请使用“CancellationToken”。 (2认同)