Sobes.tech
Назад к вопросам
Middle
5

Что будет выведено в консоль и почему? (код с Task.WhenAll, Thread.Sleep(1000) и Task.Delay(1000))

Компании, где спрашивали
PyrusPyrus

Ответ от нейросети

sobes.tech AI

Если в коде используется одновременно Thread.Sleep(1000) и Task.Delay(1000) внутри задач, а затем вызывается Task.WhenAll для ожидания всех задач, то поведение будет следующим:

  • Thread.Sleep(1000) блокирует текущий поток на 1 секунду.
  • Task.Delay(1000) создаёт асинхронную задержку, которая не блокирует поток, а возвращает задачу, завершающуюся через 1 секунду.

При запуске нескольких таких задач и ожидании их через Task.WhenAll:

  • Все задачи с Task.Delay будут выполняться параллельно, не блокируя потоки.
  • Задачи с Thread.Sleep будут блокировать потоки, что может привести к снижению параллелизма.

В итоге, в консоль будет выведено сообщение после примерно 1 секунды, если задачи запускаются одновременно и нет других блокировок. Если же Thread.Sleep используется в основном потоке, то он будет заблокирован на 1 секунду.

Пример:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var task1 = Task.Run(() => Thread.Sleep(1000));
        var task2 = Task.Delay(1000);

        await Task.WhenAll(task1, task2);
        Console.WriteLine("Все задачи завершены");
    }
}

Вывод будет примерно через 1 секунду: Все задачи завершены.

Причина в том, что Task.Delay не блокирует поток, а Thread.Sleep блокирует поток, но так как Thread.Sleep вызывается внутри Task.Run, это блокирует только поток из пула потоков, не основной поток. Task.WhenAll ждёт завершения обеих задач.