gpt4 book ai didi

c# - await 是否创建另一个线程?

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

我读了Microsoft document关于异步和等待。它说:

The async and await keywords don't cause additional threads to be created.

但是我运行下面的代码

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

namespace Examples.AdvancedProgramming.AsynchronousOperations
{
public class AsyncMain
{
static void Main()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Task task = Test();
task.Wait();
}

public async static Task Test()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}

}
}

结果是

1
1
4

很明显

await Task.Delay(1000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

在另一个线程中运行。为什么文档说没有创建线程?

我已经阅读了上一个问题Does the use of async/await create a new thread? ,但它没有回答我的问题,answer那里只是从微软来源复制粘贴。为什么我在测试中看到不同的线程 ID?

最佳答案

我总是鼓励人们阅读我的 async intro ,并跟进 async best practices .总结:

await 默认捕获“上下文”,并在该上下文中恢复执行 async 方法。在这种情况下,上下文是线程池上下文。所以,这就是您看到 Test 在线程池线程上恢复执行的原因。

asyncawait 本身不会创建任何额外的线程;例如,如果您在 UI 应用程序中执行相同操作,则“上下文”将是 UI 线程,并且 Test 将继续在该 UI 线程上执行。但是 await 隐式捕获的上下文是负责调度 asnc 延续的内容,本例中的上下文只是将其调度到线程池。

关于c# - await 是否创建另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55580234/

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