2014-12-19 33 views
1

在Asp.Net网页按钮点击我有下面的代码任务和线程调度在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. 它会返回到线程池并可用于处理其他请求?

有以下

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

你的线程上面的代码和之间的任何差别将被阻止同步等待操作在两种情况下完成。它不会回到ThreadPool

有没有区别,如果你正在使用Wait隐含通过等待异步操作完成后,将设置一个ManualResetEvent阻挡明确

async操作同步阻塞可能会导致在UI环境死锁(以及其他情况下,有一个SynchronizationContext,即ASP.Net)

不会阻挡你应该使用async-await线程:

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

使用await意味着我必须使用异步页面处理程序吗?否则响应会在异步任务完成之前返回到浏览器。 – 2014-12-19 03:23:08

+0

@SriHarshaVelicheti我相信如此。看看[这个](http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx) – i3arnon 2014-12-19 03:26:08