Sobes.tech
Back to questions
Junior — Middle
62

Если метод, запущенный через async, выполняется синхронно, возвращается ли поток в пул потоков после завершения его выполнения?

Companies where asked
Почтатех

Answer from AI

sobes.tech AI

Если асинхронный метод в C# выполняется синхронно (например, не содержит await или завершает задачу сразу), то поток, на котором он запущен, не блокируется и не удерживается дольше, чем нужно.

Однако, если метод запущен через async и возвращает Task, но внутри выполняется синхронный код, то поток, на котором он выполняется, не обязательно возвращается в пул потоков до завершения метода.

В случае использования Task.Run для запуска синхронного кода в пуле потоков, поток будет занят до завершения работы и только потом вернётся в пул.

Таким образом:

  • Если метод асинхронный, но выполняется синхронно на текущем потоке (например, UI-потоке), поток не уходит в пул потоков.
  • Если метод запускается через Task.Run, поток из пула занят до завершения.

Пример:

async Task ExampleAsync()
{
    // Синхронный код
    Thread.Sleep(1000); // блокирует текущий поток
}

// Вызов
await ExampleAsync();

Здесь поток будет занят на время Sleep.

Если же использовать Task.Run:

await Task.Run(() => Thread.Sleep(1000));

Поток из пула будет занят на 1 секунду, затем вернётся в пул.