C#任务什么时候开始?

GTH*_*ten 27 c# asynchronous task async-await

任务什么时候开始?

public void DoSomething() {
    Task myTask = DoSomethingAsync();

    Task.WaitAll(new[] { myTask }, 2000);
}

public async Task DoSomethingAsync() {
    await SomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

它是在初始化时立即Task myTask = DoSomethingAsync();启动还是在您说等待时启动Task.WaitAll(new[] { myTask }, 2000);

Pat*_*man 38

调用async方法会返回任务,即已启动的任务.因此,没有必要强制它运行的实际代码.

根据MSDN(感谢Stephen Cleary),基于任务的异步模式(TAP)模式要求返回的任务很热.这意味着所有任务,除了那些创建的任务new Task都会很热.

从引用的文章:

由公共Task构造函数创建的任务称为冷任务...所有其他任务在热状态下开始其生命周期.

  • "当你调用一个没有异步返回任务的方法时,它将无法启动." 对我来说听起来有点混乱.返回没有异步的任务的大多数方法仍然返回已经启动的任务,因为它们在方法本身内启动它. (2认同)
  • 编译器使用`async`修饰符来构建状态机。除了Task / Task <T>的构造函数之外,我能想到的任何API都会返回一个热门任务。那就是`Task.Run`所做的。那么,“当您调用的方法返回的是没有Task而不是async的Task时,它将不会自动启动。”是什么意思? (2认同)