Для 64-битной архитектуры максимальное число потоков пула потоков составляет 32768.
Не совсем, это максимальное количество потоков по умолчанию . Вы можете изменить это, позвонив ThreadPool.SetMaxThreads()
.
Значит ли это, что если количество отправляемых нами писем за раз <32768, у нас все будет хорошо? Что происходит при превышении этого числа? </p>
С вами все будет в порядке, даже если количество писем превышает этот порог. Весь смысл ThreadPool
заключается в объединении потоков. Это означает, что он создает больше потоков только тогда, когда думает, что ваша производительность от этого выиграет. Маловероятно, что он создаст столько потоков, даже если вы попытаетесь отправить десятки тысяч писем за раз.
Когда ThreadPool
думает, что вы не выиграете от создания другого потока, и вы добавите к нему больше работы, он будет поставлен в очередь и будет обработан, когда завершится какой-то другой поток, или когда ThreadPool
передумает и создаст новая тема.
Итак, создание многих рабочих элементов безопасно, но может привести к другой проблеме: голоданию. Если вы создаете электронные письма быстрее, чем можете их отправить, у вас есть большие проблемы.
Что происходит, когда служба SMTP отключена?
Send()
выдаст исключение. И поскольку кажется, что вы его не поймаете, это приведет к краху всего вашего приложения. То же самое произойдет, если письмо не может быть отправлено по другой причине.
Что произойдет, если при отправке электронной почты будет задержка, будет ли поток пула потоков ждать отправки сообщения?
Да, пока электронная почта отправляется на сервер, поток блокируется. ThreadPool
может обнаружить это и, вероятно, создаст другой поток, если какое-то другое электронное письмо ожидает отправки. Но это, вероятно, не то, что вы хотите, это, вероятно, сделает сервер еще медленнее.
Чтобы помочь с этим, вы можете ограничить максимальное количество ThreadPool
потоков. Но это глобальная настройка для вашего приложения. Вероятно, было бы лучше, если бы вы использовали Task
s с пользовательским TaskSheduler
, что позволит вам ограничить число отправляемых одновременно электронных писем, но не ограничит другую работу, которая может происходить на ThreadPool
, Это особенно важно для приложений ASP.NET, которые используют ThreadPool
для обработки запросов, но в любом случае, вероятно, не разрешат изменять количество потоков в этом случае.