Я запутался, почему Task.Delay().Wait()
занимает в 4 раза больше времени , тогда Thread.Sleep()
?
Например, task-00 работал в только потоке 9 и занимал 2193ms ?Я знаю, что ожидание синхронизации плохо в задачах, потому что весь поток блокируется.Это просто для теста.
Простой тест в консольном приложении:
bool flag = true;
var sw = Stopwatch.StartNew();
for (int i = 0; i < 10; i++)
{
var cntr = i;
{
var start = sw.ElapsedMilliseconds;
var wait = flag ? 100 : 300;
flag = !flag;
Task.Run(() =>
{
Console.WriteLine($"task-{cntr.ToString("00")} \t ThrID: {Thread.CurrentThread.ManagedThreadId.ToString("00")},\t Wait={wait}ms, \t START: {start}ms");
//Thread.Sleep(wait);
Task.Delay(wait).Wait();
Console.WriteLine($"task-{cntr.ToString("00")} \t ThrID: {Thread.CurrentThread.ManagedThreadId.ToString("00")},\t Wait={wait}ms, \t END: {sw.ElapsedMilliseconds}ms");
;
});
}
}
Console.ReadKey();
return;
С Task.Delay().Wait()
:
task-03 ThrID: 05, Wait =300 мс, запуск: 184 мс
Task-04 ThrID: 07, ожидание = 100 мс, START: 184 мс
task-00 ThrID: 09, ожидание = 100 мс, START: 0 мс
task-06 ThrID: 04, ожидание= 100 мс, START: 185 мс
Task-01 ThrID: 08, ожидание = 300 мс, START: 183 мс
task-05 ThrID: 03, ожидание = 300 мс, START: 185 мс
task-02 ThrID: 06,Ожидание = 100 мс, START: 184 мс
Task-07 ThrID: 10, ожидание = 300 мс, START: 209 мс
Task-07 ThrID: 10, ожидание = 300 мс, END: 1189 мс
task-08 ThrID: 12, Ожидание = 100 мс, START: 226 мс
task-09 ThrID: 10, ожидание = 300 мс, START: 226 мс
task-09 ThrID: 10, ожидание = 300 мс, END: 2192 мс
task-06 ThrID:04, Wait = 100 мс, END: 2193 мс
task-08 ThrID: 12, Wait = 100 мс, END: 2194 мс
task-05 ThrID: 03, Wait = 300 мс, END: 2193 мс
task-03 ThrID: 05, ожидание = 300 мс, END: 2193 мс
Task-00, ThrID: 09, ожидание = 100 мс, END: 2193 мс
Task-02, ThrID: 06, ожидание = 100 мс, END: 2193 мс
task-04 ThrID: 07, ожидание = 100 мс, END: 2193 мс
task-01 ThrID: 08, ожидание = 300 мс, END: 2193 мс
с Thread.Sleep()
:
Task-00 ThrID: 03, ожидание = 100 мс, START: 0 мс
task-03 ThrID: 09, ожидание = 300 мс, START: 179 мс
task-02 ThrID: 06, ожидание = 100 мс,START: 178ms
task-04 ThrID: 08, ожидание = 100 мс, START: 179ms
task-05 ThrID: 04, Wait = 300 мс, START: 179ms
task-06 ThrID: 07, ожидание = 100 мс, НАЧАЛО: 184 мс
Task-01 ThrID: 05, ожидание = 300 мс, START: 178 мс
Task-07 ThrID: 10, ожидание = 300 мс, START: 184 мс
Task-00 ThrID: 03, ожидание =100 мс, END: 284 мс
Task-08 ThrID: 03, ожидание = 100 мс, START: 184 мс
task-02 ThrID: 06, ожидание = 100 мс, END: 285 мс
task-09 ThrID: 06, ожидание= 300 мс, START: 184 мс
Task-04 ThrID: 08, ожидание = 100 мс, END: 286 мс
task-06 ThrID: 07, ожидание = 100 мс, END: 293 мс
task-08 ThrID: 03,Wait = 100 мс, END: 385 мс
Task-03 ThrID: 09, Wait = 300 мс, END: 485 мс
task-05 ThrID: 04, Wait = 300 мс, END: 486 мс
task-01 ThrID: 05, Втait = 300 мс, END: 493 мс
Task-07 ThrID: 10, ожидание = 300 мс, END: 494 мс
task-09 ThrID: 06, ожидание = 300 мс, END: 586 мс
Изменить:
С async
лямбда и await
Task.Delay()
так же быстро, как Thread.Sleep()
, может быть также быстрее (511 мс).
Редактировать 2:
С ThreadPool.SetMinThreads(16, 16);
Task.Delay().Wait()
работает так же быстро, как Thread.Sleep
за 10 итераций в цикле.С большим количеством итераций это снова медленнее.Также интересно, что если без настройки я увеличу количество итераций для Thread.Sleep
до 30 , это все равно будет быстрее, тогда 10 итерация с Task.Delay().Wait()
Изменить 3:
Перегрузка Task.Delay(wait).Wait(wait)
работает так же быстро, как Thread.Sleep()