0

Допустим есть метод:

public void WriteTo10sec()
{
    Console.WriteLine("begin");
    Thread.Sleep(10000);
    Console.WriteLine("finish");
}

и этот метод запускается в создаваемых потоках 10 раз:

for(int i=0;i<10;i++)
{
    Thread th = new Thread(WriteTo10sec);
    th.Start();
}

пишут, что Thread.Sleep - блокирует основной поток, и есть альтернатива Task.Delay, тогда как правильно переписать метод WriteTo10sec, чтобы сохранялась пауза? вариант:

public void WriteTo10sec()
{
    Console.WriteLine("begin");
    Task.Delay(10000).Wait();
    Console.WriteLine("finish");
}

делает задержку, но иногда гораздо больше, чем 10 сек и пишут, что Wait, так же блокирует основной поток - верно ли это? можно ли задать точную паузу в методе WriteTo10sec без блокировки основного потока и не делая этот метод асинхронным, поскольку он запускается в отдельном Thread ? т.е. не делая метод таким:

public async void WriteTo10sec()
{
    Console.WriteLine("begin");
    await Task.Delay(10000);
    Console.WriteLine("finish");
}

сейчас пробую оптимизировать код, в котором синхронный метод, который запускается в Thread, запускает в себе последовательно много других синхронных методов, в которых требуется соблюдать точные паузы. Можно ли обойтись без переписывания всего кода на асинхронный, если в конце концов метод вызывается асинхронно в Thread?

  • или в данном случае Thread.Sleep() блокирует только поток, в котором будет запущен метод, а не основной поток? – Архипов Владимир Mar 18 '21 at 06:40
  • Почему бы вам это не выяснить опытным путем? :) Поставьте после цикла, где вы создаете и запускаете потоки, вывод в консоль. Если менее чем за 10 секунд вывод произойдет, то основной поток не будет заблокирован – Andrei Khotko Mar 18 '21 at 06:50
  • 1
    пишут, что Thread.Sleep - блокирует основной поток - неправильно пишут. Правильно - блокирует текущий поток (см. документацию по методу Thread.Sleep()) – Andrei Khotko Mar 18 '21 at 06:52
  • @Andrei Khotko, Спасибо! – Архипов Владимир Mar 18 '21 at 06:54
  • 1
    Пожалуйста! А вообще, если у вас методы внутри одного потока должны выполняться через одинаковые промежутки времени, используйте System.Threading.Timer – Andrei Khotko Mar 18 '21 at 07:00
  • 1
    Если вам нужна точная пауза, то await Task.Delay дает погрешность до 30мс в большую сторону. Используйте либо таймер, либо Sleep в потоке, второе наверное даже точнее. А если нужен правильный асинхронный пример, то вот ссылка, буквально вчера я писал ответ. – aepot Mar 18 '21 at 09:10

0 Answers0