c# – 正确使用Async / Await的困惑
发布时间:2020-12-15 23:48:29 所属栏目:百科 来源:网络整理
导读:这是我在 Windows Forms Application中实现的async / await async Taskint DoAysnc1(){ await Task.Delay(3000); return 3000;}async Taskint DoAsync2(){ await Task.Delay(5000); return 5000;}private async void button1_Click(object sender,EventArgs
|
这是我在
Windows Forms Application中实现的async / await
async Task<int> DoAysnc1()
{
await Task.Delay(3000);
return 3000;
}
async Task<int> DoAsync2()
{
await Task.Delay(5000);
return 5000;
}
private async void button1_Click(object sender,EventArgs e)
{
this.textBox1.Text = "";
var doAsync1 = DoAysnc1();
var doAsync2 = DoAysnc2();
var async1 = await doAsync1;
var async2 = await doAsync2;
this.textBox1.Text = $"{async1} & {async2}";
}
5秒后,TextBox中的结果为“3000& 5000”. 但是当我像这样修改button1_Click时: private async void button1_Click(object sender,EventArgs e)
{
this.textBox1.Text = "";
var async1 = await DoAysnc1();
var async2 = await DoAysnc2();
this.textBox1.Text = $"{async1} & {async2}";
}
结果相同,但需要8秒. 为什么第二版button1_Click充当同步? 解决方法
以下是对差异的解释:
this.textBox1.Text = "";
var doAsync1 = DoAysnc1(); // <--- Run DoAsync1
var doAsync2 = DoAysnc2(); // <--- Run DoAsync2
var async1 = await doAsync1; // <--- wait for DoAsync1 to finish
var async2 = await doAsync2; //<--- wait for DoAsync2 to finish
this.textBox1.Text = $"{async1} & {async2}";
而: this.textBox1.Text = "";
var async1 = await DoAysnc1(); // <-- Run DoAsync1 and wait for it to be done
var async2 = await DoAysnc2(); // <-- Run DoAsync2 and wait for it to be done
this.textBox1.Text = $"{async1} & {async2}";
因此在第一个版本中,两个任务都在同一时间运行.在第二个版本中,您从未运行第二个任务,直到第一个任务完成. 我认为阅读这篇Article对您的知识来说将是一个很大的优势. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
