gpt4 book ai didi

c# - 对正确使用 Async/Await 的困惑

转载 作者:行者123 更新时间:2023-11-30 13:30:13 25 4
gpt4 key购买 nike

这是我在 Windows 窗体应用程序中实现的 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对您的知识有很大帮助。

关于c# - 对正确使用 Async/Await 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38567062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com