Что определяет количество незапланированных асинхронных задач в C#? - PullRequest
1 голос
/ 09 апреля 2020

Запись метода обработки, удаление элемента из очереди, обработка его, следующий элемент и т. Д.

Это не достаточно быстро, потому что иногда обработке приходится ждать сетевой ввод / вывод.

Синхронно, это await ProcessThisMessage(message).

Если я вместо этого изменю его на ProcessThisMessage(message) (то есть async Task) (запустить и забыть), каково поведение, если множество этих компонентов складывается?

Ограничено ли оно памятью и процессором машины? Или существует жесткое ограничение, такое как максимальный размер пула потоков?

В принципе, мне интересно, позаботится ли C# о себе, естественным образом ограничив и просто блокировав, когда достигнут максимум, или если я нужно что-то делать вручную, если они накапливаются и достигают предела.

1 Ответ

3 голосов
/ 09 апреля 2020

Это недостаточно быстро

Обычное решение - добавить еще один экземпляр процессора. Возможно, на другой машине, возможно, на той же машине. Я работал с некоторыми процессорами, которые являются многопоточными, причем каждый поток независимо брал из очереди; и я работал с некоторыми процессорами, которые масштабируются на несколько машин.

«Запусти и забудь» - это не нормальное решение, потому что «запустить и забыть» означает «я не делаю» все равно, если это не удастся ", и обычно вы делаете все равно, если это не получится.

При этом:

Ограничено ли оно памятью и процессором компьютера ? Или существует жесткое ограничение, такое как максимальный размер пула потоков?

Асинхронные задачи ограничены только памятью. Каждая задача «запусти и забудь» будет существовать до тех пор, пока она не будет завершена (или пока приложение не закроется). В .NET нет никаких ограничений; вашему приложению не хватит памяти.

...