Задачи и планирование потоков в Asp.Net

1

На странице веб-страницы 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();
Теги:
multithreading
task-parallel-library

1 ответ

1
Лучший ответ

Ваш поток будет заблокирован синхронно, ожидая завершения операции в обоих случаях. Он не вернется к ThreadPool.

Нет никакой разницы, если вы явно блокируете использование Wait или неявно, ожидая в ManualResetEvent, который будет установлен после завершения асинхронной операции.

Блокирование синхронно при операции async может привести к взаимоблокировкам в средах пользовательского интерфейса (и в других случаях, где есть SynchronizationContext, то есть ASP.Net)

Чтобы не блокировать этот поток, вы должны использовать async-await:

await new HttpClient().GetAsync("/someapiCall");
  • 0
    Использование await будет означать, что я должен использовать обработчики асинхронных страниц, верно?, Иначе ответ вернется в браузер даже до завершения асинхронной задачи.
  • 0
    @SriHarshaVelicheti Я верю в это. Взгляни на это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню