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();

现在当我调用任务时。等待工作线程会发生什么?

  1. 它会处于挂起状态,等待 httpClient 调用完成吗?
  2. 它是否会返回到线程池并可用于处理其他请求?

上面的代码和下面的代码有什么区别吗

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();

Asp.Net 中的任务和线程调度

在这两种情况下,您的线程都将被同步阻塞,等待操作完成。它不会回到ThreadPool.

如果使用 Wait 显式阻止,或者通过等待异步操作完成后设置的ManualResetEvent隐式阻止,则没有区别。

async操作上同步阻塞可能会导致 UI 环境中的死锁(以及其他存在SynchronizationContext的情况,即 ASP.Net(

为了不阻塞该线程,您应该使用async-await

await new HttpClient().GetAsync("/someapiCall");