Допустим есть метод:
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 - блокирует основной поток- неправильно пишут. Правильно - блокирует текущий поток (см. документацию по методу Thread.Sleep()) – Andrei Khotko Mar 18 '21 at 06:52await Task.Delayдает погрешность до 30мс в большую сторону. Используйте либо таймер, либоSleepв потоке, второе наверное даже точнее. А если нужен правильный асинхронный пример, то вот ссылка, буквально вчера я писал ответ. – aepot Mar 18 '21 at 09:10