На странице веб-страницы 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, что произойдет с рабочим потоком?
Есть ли разница между приведенным выше кодом и ниже
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();
Ваш поток будет заблокирован синхронно, ожидая завершения операции в обоих случаях. Он не вернется к ThreadPool
.
Нет никакой разницы, если вы явно блокируете использование Wait
или неявно, ожидая в ManualResetEvent
, который будет установлен после завершения асинхронной операции.
Блокирование синхронно при операции async
может привести к взаимоблокировкам в средах пользовательского интерфейса (и в других случаях, где есть SynchronizationContext
, то есть ASP.Net)
Чтобы не блокировать этот поток, вы должны использовать async-await
:
await new HttpClient().GetAsync("/someapiCall");