в очереди на выполнение.
в одном из тех 5 выполняющихся потоков:
Task.Delay(10000); или DoSomethingAsync().GetAwaiter().GetResult() - поток в режиме выполнения, не даёт выполняться другому потоку из очереди.
await Task.Delay(10000); или await DoSomethingAsync() - поток встает типа в очередь, дает другому потоку из очереди начать выполнение и выполняться, пока ждет завершения тех штук. когда они завершатся, другой поток обратно встает в очередь, а этот продолжает выполняться
я правильно понял?
1. что подразумевается под очередью потоков? Это TaskSchrduler, ThreadPool или что то сделанное на коленке? 2. Проблема блокировки других потоков , это проблема блокировки основного потока выполнения программы. Если он блокируется, то другие потоки не могут синхронизироваться с текущим контекстом.
но опять же если другие потоки запускаются по принципу, fire and forget им не нужен основной поток , и они будут выполнены в независимости блокировки основного потока
В стандартном случае всё работает не так. В то время, как ты ждёшь чего-то асинхронно , поток разблокируется и возвращается в пул. А вот если там блокирующее ожидание — тогда да, он будет тупо стоять и ничего не делать. У стандартного тредпула есть всякие эвристики для того, чтобы наличие таких заблокированных потоков не вызывало катастрофы. Но всё равно, лучше работать асинхронно, если есть возможность.
Обсуждают сегодня