gpt4 book ai didi

c# - 在 async/await 中调用 async 方法和 TaskScheduler

转载 作者:太空狗 更新时间:2023-10-30 01:35:44 24 4
gpt4 key购买 nike

考虑以下代码

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 方法中的 await - 将使用哪个 TaskScheduler?它会使用默认值还是传递给父任务的参数?

最佳答案

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

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

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

关于c# - 在 async/await 中调用 async 方法和 TaskScheduler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24560554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com