gpt4 book ai didi

c# - 异步等待和线程

转载 作者:太空狗 更新时间:2023-10-29 22:05:06 26 4
gpt4 key购买 nike

基于我在 MSDN 上阅读的内容

The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.

基本上是说不会创建线程。但是在我继承的类中 HttpClient 我发现了一些有趣的东西..

async Task<T> SendAsync<T>(HttpMethod method, Uri uri, HttpContent content, CancellationToken cancellationToken) 
{
HttpRequestMessage msg = new HttpRequestMessage(method, uri);
msg.Content = content;
//On Main Thread
HttpResponseMessage response = await SendAsync(msg, cancellationToken);
//On worker thread
//...
}

方法在 static void Main 中调用

Task result = client.GetAsync<string>(...);
//GetAsync calls await SendAsync<T>
result.Wait();

为什么在 await SendAsnc 调用后我在一个单独的线程上?我认为 asyn 不会创建新线程。或者至少它会在 await 之后被调用回原来的线程。

最佳答案

这在文档中的宣传不佳,但由于控制台应用程序中缺少同步上下文,async/await 在控制台应用程序中的工作方式与它在 UI 应用程序中的工作方式有很大不同。 This article描述细节并提供代码示例,说明如何添加一个以便 async/await 以更可预测的方式运行。

通常情况下,您对 async/await 的看法是绝对正确的,必然需要多线程(尽管像 Task.Run 这样的事情 确实,实际上会导致相关代码在线程池中运行),但是(如我链接到的文章中所述)在控制台应用程序中,async/await 可以在任何地方运行。

对于在同一个线程上运行时异步如何工作,我通常的类比是想和其他 9 个人(所以总共 10 个人)去一家餐馆。当服务员过来时,有 9 个人已经准备好了,而第 10 个人还没有。在这种情况下,服务员会先接其他9个人的单,然后再回来给第10个人点单。如果出于某种原因,第 10 个人真的慢了,服务员总是可以将订单带回厨房,并在第 10 个人准备好后回来。

显然,为了等待第 10 个人准备好点餐而引入第二个服务员是没有意义的,而且让其他人都等待一个人准备好显然是低效的。在这种情况下增加额外的服务员不会加快速度,因为延迟不是由于缺少服务员造成的,而是由于第 10 个人下定决心很慢(侍应生对此无能为力) ).

关于c# - 异步等待和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40249169/

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