gpt4 book ai didi

c# - 这两种异步方法有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:21:07 24 4
gpt4 key购买 nike

所以我正在学习 C# 中的 async/await,我制作了一个小型 Windows 窗体应用程序来玩转 async/await。我想到了这些:

下面是用于以下两种方法的 button1_Click:

    private void button1_Click(object sender, EventArgs e)
{
GetSiteAsync();
}

这是应用程序的外观:

enter image description here

方法一:

    public async void GetSiteAsync()
{
HttpClient ht = new HttpClient();
Task<string> getTaskString = ht.GetStringAsync("http://stackoverflow.com");

label1.Text = "Loading...";

string siteString = await getTaskString;

label1.Text = "Finished! Site Length = " + siteString.Length;
}

方法二:

public async void GetSiteAsync()
{
HttpClient ht = new HttpClient();
string siteString = await ht.GetStringAsync("http://stackoverflow.com");

label1.Text = "Loading...";

label1.Text = "Finished! Site Length = " + siteString.Length;
}

在第一种方法中,当我单击“加载 URL”按钮时,它会将标签更改为“正在等待...”,当加载完成时,它会将其更改为“完成!”附加网站长度。

在第二种方法中,当我点击按钮时它不会更改标签,当操作完成时它会将标签更改为站点长度。

我注意到这两种方法不会导致程序 GUI 在加载网站时卡住。

那么为什么第二种方法无法将按钮更改为“正在加载...”??

最佳答案

await 中的调用完成后执行 await 运算符之后的代码。这可以在另一个线程中完成。在后台创建一个状态机,我们说 await 之后的代码将继续执行。

所以在第一种情况下,

Task<string> getTaskString = ht.GetStringAsync("http://stackoverflow.com");
label1.Text = "Loading...";

您只需进行异步调用,然后设置 label1Text 值。

在第二种情况下,

string siteString = await ht.GetStringAsync("http://stackoverflow.com");
label1.Text = "Loading...";

等待这个电话。这意味着在这个异步调用完成后,label1.Text 的 setter 将被执行。

关于c# - 这两种异步方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684967/

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