我开始研究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;
}
答案 0 :(得分:5)
async Task<int> CountForALongTimeAsync(int counter)
{
接下来会执行什么,直到第一个await
异步调用实际上做了一些等待(可能某个给定的调用可能需要立即返回它,例如一个可能的服务)上网或者可能从缓存中返回数据,在这种情况下它不会等待。
根本没有await
次调用,因此返回的Task
已经完成。
由于调用await CountForALongTimeAsync
是await
已完成返回的任务,因此它会同步运行。
该方法会更好:
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.
}