Из 1000 созданных задач, скажем, только немногие (10) будут выполнены, основываясь на успешном выполнении taskCompletionSource в какой-то другой части кода. Это означает, что ProcessWorkItemAsyn c готово будет напечатано только 10 раз.
Код, который вы опубликовали, не имеет такого поведения. Размещенный код будет напечатан "ProcessWorkItemAsync finished"
1000 раз, и все задачи будут выполнены практически сразу. В остальной части этого ответа я собираюсь ответить на вопросы и проигнорировать код.
Есть ли нагрузка ЦП на задачу 990, которая не завершается и находится в подвешенном состоянии?
Нет.
Из того, что я прочитал, поток не будет заблокирован, он будет возвращен в пул потоков, поэтому с точки зрения ЦП не возникает никаких накладных расходов. .Что-то еще мне не хватает?
Задачи не являются потоками. Тот факт, что у вас есть 1000 задач, никоим образом не означает, что в них участвует или было задействовано 1000 потоков.
Task.Run
выполняет работу очереди в пул потоков, но при использовании асинхронных задач с Task.Run
этот пул потоков поток возвращается в пул потоков в любое время await
должен асинхронно ждать. Завершены ли задачи или нет, несущественно.
Есть ли накладные расходы памяти?
Да. Задачи - это объекты, как и любой другой ссылочный тип. Они могут быть укоренены, как и любой другой ссылочный тип. И если они никогда не будут очищены (завершены), они могут быть утечка ресурсов , как и любой другой тип ссылки.
из-за сохранения стеков вызовов, так как точка net должен отслеживать, куда вернуться. Я предполагаю, что эти стеки вызовов будут храниться в куче и будут стоить памяти?
Вроде. Стеки вызовов не фиксируются и не сохраняются. Задача хранит только ее продолжения. Логично, что вы можете думать об этом как о «стеке вызовов», но он имеет глубину только 1. Таким образом, каждая задача будет поддерживать любой код, который await
s это.