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对您的知识来说将是一个很大的优势. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |