声明一个任务属性并等待它

Sho*_*ver 5 .net c# lambda asynchronous async-await

我被困在一些我认为很简单的事情上,这让我无法自拔。

我需要在某个时候声明一个任务并稍后运行它,我想到了:

Task T1 { get; set; }

public async Task CreateAndAwaitAsync()
{
    T1 = new Task(() => {
        // time consuming work like:
        System.Threading.Thread.Sleep(1000);
    }

    await T1;
}
Run Code Online (Sandbox Code Playgroud)

当然,lambda 的主体和方法只是为了这个例子(正如我所说的,我需要稍后运行它),但无论如何,await T1我就是无法进入 lambda!我错过了什么??我觉得很愚蠢,因为我已经使用 async-await 范式好几年了,我什至没有想到这行不通!

Evk*_*Evk 5

我认为可以在评论中回答,但最好提供更多信息。

await意思是“等待这个任务完成,然后做剩下的事情”。您示例中的任务未启动。await不会为您启动它,因此整个方法将一直停留在await您开始任务之前。

即使使用您当前的代码,如果您稍后这样做T1.Start()- 它会运行您的 lambda,并在它完成后 - 您返回的任务CreateAndAwaitAsync也将完成。

否则 - 要么在创建任务时立即启动 ( Task.Run) 要么直接返回Task而没有任何 async\await:

public Task CreateAndAwaitAsync()
{
    T1 = new Task(() => {
        // time consuming work like:
        System.Threading.Thread.Sleep(1000);
    }
    // if you need to start it somewhere, do T1.Start();
    return T1;
}
Run Code Online (Sandbox Code Playgroud)