Asp.Net 中的任务和线程调度
本文关键字:线程调度 任务 Net Asp | 更新日期: 2023-09-27 18:34:43
在 Asp.Net 网页按钮中单击我有以下代码
//Code is running on Asp.Net worker Thread
var httpClient = new HttpClient();
var task = httpClient.GetAsync("/someapiCall"); //Creates a new thread and executed on it
task.Wait();
现在当我调用任务时。等待工作线程会发生什么?
- 它会处于挂起状态,等待 httpClient 调用完成吗?
- 它是否会返回到线程池并可用于处理其他请求?
上面的代码和下面的代码有什么区别吗
var httpClient = new HttpClient();
var task = httpClient.GetAsync("/someapiCall"); //Creates a new thread and executed on it
ManualResetEvent mre = new ManualResetEvent(false);
task.ContinueWith((t) => { mre.Set(); });
mre.WaitOne();
在这两种情况下,您的线程都将被同步阻塞,等待操作完成。它不会回到ThreadPool
.
如果使用 Wait
显式阻止,或者通过等待异步操作完成后设置的ManualResetEvent
来隐式阻止,则没有区别。
在async
操作上同步阻塞可能会导致 UI 环境中的死锁(以及其他存在SynchronizationContext
的情况,即 ASP.Net(
为了不阻塞该线程,您应该使用async-await
:
await new HttpClient().GetAsync("/someapiCall");