在async / await中调用异步方法和TaskScheduler

时间:2014-07-03 18:06:04

标签: c# asynchronous async-await .net-4.5

考虑以下代码

async Task<int> foo()
{
    await Task.Delay(1000);
    return 42; 
}

...
// OPTION 1

Task t = Task.Factory.StartNew(foo,
            CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

t.Wait();


...
// OPTION 2
Task t = foo();
t.Wait()

问题

  1. 两个通话选项之间的实质区别是什么?

  2. 在选项1中。假设我覆盖默认的TaskScheduler。等待foo方法 - 将使用哪个TaskScheduler?它会使用默认值还是参数传递给父任务?

1 个答案:

答案 0 :(得分:3)

一般情况下,“选项1”会创建一个新任务,将foo()的调用包裹起来,有效地制作Task<Task<int>>。当你在它上面调用.Wait()时,它不会等待内部任务完成,因为内部任务几乎立即返回(一旦Task.Delay)被击中。

关于使用非默认TaskScheduler的问题,一般来说,它不会改变行为,除非它可能会阻塞,直到自定义调度程序启动任务。如果没有关于调度程序的更多信息,就不可能确切地知道会发生什么。

然而,第二个选项将阻塞,直到延迟完成,因为它将启动任务,并阻止直到延迟完成。