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

时间:2016-12-07 10:34:59

标签: 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;
    }

1 个答案:

答案 0 :(得分:5)

async Task<int> CountForALongTimeAsync(int counter)
{

接下来会执行什么,直到第一个await异步调用实际上做了一些等待(可能某个给定的调用可能需要立即返回它,例如一个可能的服务)上网或者可能从缓存中返回数据,在这种情况下它不会等待。

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

由于调用await CountForALongTimeAsyncawait已完成返回的任务,因此它会同步运行。

该方法会更好:

async Task<int> CountForALongTimeAsync(int counter)
{
    await Task.Delay(3000);
    counter++;
    return counter;
}

顺便说一句,事先await做某事非常(但并非完全)相似的做法是:

Task<int> CountForALongTimeAsync(int counter)
{
    return Task.Delay(3000).ContinueWith(t =>
    {
        ++counter;
        return counter;
    });
}

考虑到这些是&#34;继续&#34;任务可能会或可能不会给出一些见解。

相比之下,最接近你的问题中代码的预先等待方式是:

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