考虑以下代码
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中。假设我覆盖默认的TaskScheduler。等待foo方法 - 将使用哪个TaskScheduler?它会使用默认值还是参数传递给父任务?
答案 0 :(得分:3)
一般情况下,“选项1”会创建一个新任务,将foo()
的调用包裹起来,有效地制作Task<Task<int>>
。当你在它上面调用.Wait()
时,它不会等待内部任务完成,因为内部任务几乎立即返回(一旦Task.Delay
)被击中。
关于使用非默认TaskScheduler
的问题,一般来说,它不会改变行为,除非它可能会阻塞,直到自定义调度程序启动任务。如果没有关于调度程序的更多信息,就不可能确切地知道会发生什么。
然而,第二个选项将阻塞,直到延迟完成,因为它将启动任务,并阻止直到延迟完成。