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

C# Asp.Net中的任务和线程调度,c#,asp.net,.net,multithreading,task-parallel-library,C#,Asp.net,.net,Multithreading,Task Parallel Library,在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(); 现在,当我调用task.Wait时,工作线程会发生什么情况 它是否会处于挂起状态,等待ht

在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();
现在,当我调用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();
    

    在这两种情况下,线程将被同步阻止,等待操作完成。它不会返回到
    线程池

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

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

    要不阻止该线程,应使用
    async wait

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

    使用await意味着我必须使用异步页面处理程序,对吗?否则,即使在异步任务完成之前,响应也会返回到浏览器。@SriHarshaVelicheti我相信是这样的。看看