2014-12-19 3 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 означает, что я должен использовать обработчики Async-страниц правильно, иначе ответ вернется в браузер даже до завершения асинхронной задачи. –

+0

@SriHarshaVelicheti Я так считаю. Взгляните на [это] (http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx) – i3arnon

Смежные вопросы