С помощью этого кода:Thread заблокирован после ждать
static void Main(string[] args)
{
Console.WriteLine("Main Thread Pre - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
Task.Run(() => AsyncMethod()).Wait();
Console.WriteLine("Main Thread Post - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
Console.ReadKey();
}
static async Task AsyncMethod()
{
Console.WriteLine("AsyncMethod Thread Pre - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
await Task.Delay(4000).ConfigureAwait(false);
Console.WriteLine("AsyncMethod Thread Post - " + GetNativeThreadId(System.Threading.Thread.CurrentThread));
}
Выход:
Main Thread Pre - 8652
AsyncMethod Thread Pre - 4764
AsyncMethod Thread Post - 1768
Main Thread Post - 8652
Использование Concurrency Visualizer, я могу видеть, что во время второй задержки 4, поток 4764 застрял в синхронизации , В конце концов он отключается основным потоком при выключении.
Не следует ли возвращать 4764 на ThreadPool
после того, как он попадает в await
? (При этом я не знаю, как это выглядело бы в конвергентном визуализаторе)
Можете ли вы продемонстрировать какую-либо проблему *, не прибегая к визуализатору параллелизма? –
Нет, я не могу.Я сделал это как упражнение, чтобы увидеть, что ожидаемая нить похожа на визуализатор параллелизма, и была удивлена, увидев, что он сидит в категории «Синхронизация», когда он ждет. Либо мое понимание асинхронности неверно, либо я неверно истолковываю то, что говорит мне визуализатор параллелизма. Полагаю, я просто ищу подтверждение, что поток 4764 действительно должен быть возвращен в ThreadPool, когда он попадает в ожидании. – Cuthbert
Задание задачи задерживается, но вызов Delay по-прежнему внутренне запускает таймер и, как таковая, выполняет работу. Задержка не является задержкой планирования. –