Я создал веб-сайт для массовой рассылки электронной почты для клиента, который должен отправить 80 000 писем за одну отправку.По сути, он создает новый поток для отправки, так что управление может быть передано обратно в пользовательский интерфейс (чтобы можно было загрузить страницу обратной связи), а затем для каждой компании создается новый поток, чтобы отправлять электронные письма их получателям.Все электронные письма помещаются в очередь с использованием этого кода:
// Loop through the companies and send their mail to the specified recipients
// while creating a new thread for each company
// A new thread is started so that the feedback page can load
SendingThread = Task.Factory.StartNew(() =>
{
// This is a thread safe for loop
Parallel.ForEach<CompanyEntity>(companies, company =>
{
// Start a new thread for each company send
Task.Factory.StartNew(() =>
{
// Get the recipients for this company
var companyRecipients = GetSubscribersForCompany(company.Id, recipients);
// Send the newsletter to the company recipients
var success = SendNewsletterForCompany(newsletter, company, companyRecipients, language,
version, company.AdvertCollectionViaNewsletterCompanyAdvertLink, newsletter.NewsletterType, email);
// Add the status update so the front end can view a list of updated conpany statuses
if (success)
AddStatusUpdate(company.CompanyTitle + " has completed processing.");
// Starts sending the emails if the engine hasn't already been started
SendEngine.Start(CurrentSmtpClient, this);
}).ContinueWith(antecendent => EndCompaniesSendUpdate(companiesToProcess, companiesProcessed), TaskContinuationOptions.OnlyOnRanToCompletion);
});
}, new CancellationToken(), TaskCreationOptions.LongRunning, TaskScheduler.Default);
Когда электронные письма помещаются в очередь, механизм отправки берет на себя и извлекает электронные письма из очереди, а затем отправляет их, используя новый класс Parallel:
Action action = () =>
{
MailMessage message;
while (queue.TryDequeue(out message))
{
SendMessage(sendingServer, message, factory);
}
};
// Start 5 concurrent actions to send the messages in parallel.
Parallel.Invoke(action, action, action, action, action);
Все это прекрасно работает и может отослать 40 000 рассылок за 10 минут.Единственная проблема заключается в том, что ОЗУ и ЦП на сервере потребляются на 100% в течение этих 10 минут.Это влияет на другие сайты на сервере, так как к ним нельзя получить доступ.
Есть ли способ ограничить использование ресурсов отправляющим приложением в IIS 7.5 или путем изменения кода выше?