Этот код обрабатывает коллекцию клиентов и отправляет им электронные письма через 14 дней с момента их последнего контакта. Мой вопрос: если таблица клиентов очень БОЛЬШАЯ и отправка электронного письма занимает несколько секунд, НЕ будет ли этот код переводить процессор в режиме отказа в обслуживание на другие важные процессы?
Есть ли способ запускать следующие строки кода параллельно, но используя только несколько ядер, чтобы другие процессы могли использовать процессор? Или я неправильно подхожу к проблеме?
Код: Выделить всё
Parallel.ForEach(customers, (customer, parallelLoopState) =>
{
// database operation
DateTime lastContact = theStore.GetLastContact(customer);
TimeSpan timeSinceContact = DateTime.Now - lastContact;
// If it's been more than two weeks, send an email, and update...
if (timeSinceContact.Days > 14)
{
// Exit gracefully if we fail to email, since this
// entire process can be repeated later without issue.
if (theStore.EmailCustomer(customer) == false)
parallelLoopState.Break();
else
customer.LastEmailContact = DateTime.Now;
}
});
Мыслительный процесс был ПРАВИЛЬНЫМ! как отметил Коул Кэмпбелл: «Можно контролировать и настраивать количество используемых ядер, указав объект ParallelOption в этом конкретном примере. Вот как.
Код: Выделить всё
var parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism =
Math.Max(Environment.ProcessorCount / 2, 1);
Код: Выделить всё
Parallel.ForEach(customers, parallelOptions,
(customer, parallelLoopState) =>
{
//do all same stuff
}
Для получения дополнительной информации о настройке параметров параллельного выполнения прочитайте это.
Подробнее здесь: https://stackoverflow.com/questions/105 ... -processes