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

时间:2014-12-19 03:13:22

标签: 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工作线程会发生什么?

  1. 是否处于挂起状态,等待httpClient调用完成?
  2. 它是否会返回到线程池并可用于处理其他请求?
  3. 上述代码与下面的代码有什么区别

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

1 个答案:

答案 0 :(得分:1)

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

如果您使用Wait隐式阻止显式,则等待ManualResetEvent之后设置异步操作完成。

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

要不阻止您应该使用async-await

的线程
await new HttpClient().GetAsync("/someapiCall");