gpt4 book ai didi

c# - async/await 创建新线程,输出窗口显示

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:55 25 4
gpt4 key购买 nike

我读过很多文章说 async/await 不会创建额外的线程。但是在 Visual Studio 的 Debug模式下,Output 和 Thread 窗口的消息却相反。

我用一些代码创建了一个非常简单的示例窗口窗体;

private void button2_Click(object sender, EventArgs e)
{
Task t = methodAsync();
//t.Wait();
}
async Task methodAsync()
{
Console.WriteLine($"==before DownloadStringTaskAsync");
using (var wc = new System.Net.WebClient())
{
string content = await wc.DownloadStringTaskAsync("https://stackoverflow.com");
}
Console.WriteLine($"==after DownloadStringTaskAsync");
}

我在 Debug模式下启动应用程序,我通过单击调试工具栏上的暂停按钮暂停它。 Threads 窗口显示只有一个 Main thread,到目前为止是正常的。

enter image description here

然后我点击按钮执行methodAsync。当它完成 DownloadString 时,我再次暂停应用程序,然后我在线程窗口中看到几个额外的线程。

enter image description here

大约 10 秒后,输出窗口显示消息 “线程 xxx 已退出,代码为 0 (0x0)”

enter image description here

当我将 WebClient.DownloadStringTaskAsync 替换为 await Task.Delay(xxx) 时,结果相同我想知道 async/await 是否真的会创建新线程。

有什么解释吗?

最佳答案

asyncawait 只是构成方法的关键字 awaitable ,然后允许您异步等待它并恢复执行。 Tasks是表示方法执行的异步结果的底层框架元素,TaskScheduler负责协调Tasks的执行,可能涉及到使用Thread Pool、创建新线程等。Windows上默认的Task Scheduler一般使用Thread Pool来执行任务。

关于c# - async/await 创建新线程,输出窗口显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366871/

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