我开始学习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)
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)
| 归档时间: |
|
| 查看次数: |
1491 次 |
| 最近记录: |