了解基于任务的异步模式C#

M. *_* Ko 0 c# async-await

我开始学习C#TAP编码。我不明白为什么代码会同步运行

    async private void timer1_Tick(object sender, EventArgs e)
    {
        SyncCount++;
        result1.Text = SyncCount.ToString();

        AsyncCount = await CountForALongTimeAsync(AsyncCount);
        result2.Text = AsyncCount.ToString();
    }

    async Task<int> CountForALongTimeAsync(int counter)
    {
        Thread.Sleep(3000);
        counter++;
        return counter;
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*nna 5

async Task<int> CountForALongTimeAsync(int counter)
{
Run Code Online (Sandbox Code Playgroud)

接下来的操作将一直执行到第一个await实际进行一些等待的ed异步调用为止(给定的调用可能具有立即返回的所有条件,例如,可能会访问Internet或从缓存返回数据的服务)。在这种情况下,它不会等待)。

根本没有awaited调用,因此Task返回的返回已经完成。

由于调用await CountForALongTimeAsync正在await执行已返回的任务,因此它将同步运行。

该方法将更好,因为:

async Task<int> CountForALongTimeAsync(int counter)
{
    await Task.Delay(3000);
    counter++;
    return counter;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,await做一件非常(但不完全)相似的事情的先行方法是:

Task<int> CountForALongTimeAsync(int counter)
{
    return Task.Delay(3000).ContinueWith(t =>
    {
        ++counter;
        return counter;
    });
}
Run Code Online (Sandbox Code Playgroud)

考虑到这些是在任务执行后“继续”的不同想法,可能会或可能不会提供某些见解。

相反,执行问题代码的最接近的等待方式是:

Task<int> CountForALongTimeAsync(int counter)
{
    Thread.Sleep(3000);
    counter++;
    return Task.FromResult(counter); //FromResult returns an already completed task.
}
Run Code Online (Sandbox Code Playgroud)