gpt4 book ai didi

c# - 如果线程正在等待异步操作完成,.NET Task 线程的资源是否会暂时返回池中?

转载 作者:可可西里 更新时间:2023-11-01 08:45:00 26 4
gpt4 key购买 nike

我有一个做两件事的 TPL 任务。首先,它调用网络服务。其次,它将一些数据插入数据库。我有多达 20 个任务同时开始,一遍又一遍地做同样的事情。他们整天所做的就是调用 Web 服务并将数据插入数据库。

我对 .NET 中的 TPL 还很陌生。我已经完成了一些有关后台工作进程和异步 Web 服务的工作。

Web 服务调用和数据库插入都是任务运行线程内的阻塞调用。

我知道在幕后,当您使用 Tasks 时,.NET 会为您管理一个线程池。是吗?

如果我使用 async 和 await() 进行服务调用和数据库调用而不是使它们阻塞调用,线程池是否会有更多线程供其使用?

我的理论(我不确定我为什么这么认为)是线程在等待阻塞的 Web 服务时正忙于无所事事,无法暂时将其资源返回到池中。但我想知道任务是否正在等待异步调用完成,主任务线程是否能够在等待时切换到让其他东西处理。

我的理论对吗?还是我在编造东西?

我使用的是 c# 和 .NET 4.0,但如果需要我可以升级到 4.5。

最佳答案

Would the thread pool have more threads at its disposal if I made the service call and database call with async and await() instead of making them blocking calls?

这取决于您所说的“使用异步等待”是什么意思。

当您使用 Task.Run 时,在后台,Task 类使用 ThreadPool 使用 ThreadPool 卸载工作线程。

如果您的服务没有公开真正的异步 api 并且您使用 Task.Run 来排队您的工作,您仍然会阻塞线程池线程来执行 IO 绑定(bind)工作,无论使用异步等待。在您的问题中,您声明这两个调用都是阻塞调用,在这种情况下,答案是否定的,用于进行这些阻塞调用的线程池线程仍将被阻塞。

如果您的服务和数据库调用是真正的异步 API(不消耗任何额外线程来完成其工作的 API),您可以利用 async-await,就像您 await 在其中一个调用上(并且您根本不需要对它们使用 Task.Run),当前线程会将控制权交还给调用者,同时可以用来做更多的工作.如果是这种情况,那么是的。

My theory (and I'm not sure why I think this) is that the thread is busy doing nothing while waiting on the blocking web service and can't return its resources temporarily to the pool. But I wonder if the Tasks were waiting for async calls to finish whether the main Task thread would be able to switch to let other stuff process while waiting.

你的理论是正确的。如果排队线程池的主要工作是发出 IO 绑定(bind)请求,那么它花费的大部分时间只是阻塞,直到请求完成。

当您await Task 时,控制权返回给调用者。假设您的服务调用是 REST 调用,您可以使用 HttpClient 公开真正的非线程消耗异步方法,例如 GetAsyncPostAsync、当您 await 这些调用时,您的调用线程将被释放以同时执行更多工作。

关于c# - 如果线程正在等待异步操作完成,.NET Task 线程的资源是否会暂时返回池中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322863/

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