gpt4 book ai didi

c# - 如果异步方法是单线程的,它如何在后台运行?

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

我试图理解异步/等待并阅读了很多文章,但仍然对同步/异步的性质感到困惑。

我有以下测试控制台应用程序:

static void Main(string[] args)
{
var test = FooAsync();
Console.WriteLine("After FooAsync");

for (int i = 0; i < 100; i++)
Console.WriteLine("After that");

Console.ReadKey();
}

private static async Task FooAsync()
{
Console.WriteLine("Before delay");
await Task.Delay(1);
Console.WriteLine("After delay");
}

代码给出的输出如下:

Before delay
After FooAsync
After that
After that
After that
After that
After delay
After that
.
.

我知道 async/await 不会创建一个单独的线程进行处理,并且在 FooAsync 到达 await Task.Delay(1) 行,它将返回到 Main,因为任务尚未完成,但是,由于我们只在单个线程上运行,有人可以解释是什么触发了 FooAsyncMain 可以继续之前在 Main 中的任意点恢复的方法?

更新我收回它,i3arnon 和 dariogriffo 是正确的。该代码确实使用了多个线程(正如我之前在调试器中看到的那样,或者按照 kha 的建议做了显而易见的事情)。我被下一页的线程部分弄糊涂了 https://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_Threads没有意识到“继续”实际上是指在“等待”的任务完成后立即运行的继续任务计划。

最佳答案

这不是单线程

当延迟任务完成时,该方法的其余部分将发布到 ThreadPool 并与您的主线程同时运行。这里的“触发器”是在 Task.Delay 中使用的内部 System.Threading.Timer 的回调。

此行为取决于 SynchronizationContext。在 UI 环境中,这将被发布到同一个 UI 线程,并且必须等到该线程空闲。

如果您一直在等待从 FooAsync 返回的任务,那么您每次只会运行一个线程。

关于c# - 如果异步方法是单线程的,它如何在后台运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527349/

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