gpt4 book ai didi

c# - 在 c# 5.0 中, "async/await"函数是否总是在运行开始时在主线程上运行

转载 作者:太空狗 更新时间:2023-10-30 01:18:53 26 4
gpt4 key购买 nike

我发现当我调用一个“async”函数时,一开始,线程是主线程。当它遇到await Task时,则该线程将被更改为另一个线程。

static void Main(string[] args)
{
println("Mainthread ID " + Thread.CurrentThread.GetHashCode());
var s = DoSomethingAsync();
println("Waiting for DoSomethingAsync Complete ");
Thread.Sleep(2000);
println(s.Result.ToString());
}

static async Task<int> DoSomethingAsync()
{
println("DoSomethingAsync Thread ID " + Thread.CurrentThread.GetHashCode());
int val = await Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
println("Task Thread ID " + Thread.CurrentThread.GetHashCode());
return 100;
});

println("DoSomethingAsync end " + Thread.CurrentThread.GetHashCode());
return val;

结果如下:

11:40:34 383 Mainthread ID 1
11:40:34 398 DoSomethingAsync Thread ID 1
11:40:34 400 Waiting for DoSomethingAsync Complete
11:40:35 400 Task Thread ID 3
11:40:35 400 DoSomethingAsync end 3
11:40:36 401 100

我们可以看到mainthread id是1。DoSomethingAsync Thread ID也是1。它们是一样的。所以在运行“async”函数的开始,它是执行这部分的主线程。

这意味着当主线程遇到“async”函数时,它将被阻止运行某些东西,直到它遇到 await Task。“async”函数不会立即使事情异步。这样对吗?

我知道如果“异步”函数中没有等待任务,这个“异步”函数将同步运行。

最佳答案

This means when the main thread meet the "async" function, it will be blocked to run something until it meet the await Task.The "async" function doesn't make things asynchronous instantly. Is it right?

是的,没错。您的 async 方法将一直运行,直到遇到它的第一个 await 关键字,此后它将把控制权交还给调用者。在您的示例中,您不会await 该方法,因此它将立即继续执行下一个方法。

作为旁注,控制台应用程序实际上并没有主线程,因为它使用默认的ThreadPoolSynchronizationContext。这意味着您将在等待的异步方法之后看到任意线程 ID。

关于c# - 在 c# 5.0 中, "async/await"函数是否总是在运行开始时在主线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25268748/

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