Может ли параллелизм в .Net взять на себя управление процессором и отказать в обслуживании другим процессам?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Может ли параллелизм в .Net взять на себя управление процессором и отказать в обслуживании другим процессам?

Сообщение Anonymous »

Я пытаюсь понять, как параллелизм реализован в .Net. Следующий код взят в качестве примера из блога Reed Copsey.
Этот код обрабатывает коллекцию клиентов и отправляет им электронные письма через 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 будет использоваться следующим образом.

Код: Выделить всё

Parallel.ForEach(customers, parallelOptions,
(customer, parallelLoopState) =>
{
//do all same stuff
}
Ту же концепцию можно применить и к PLINQ, используя .WithDegreeOfParallelism(int NumberOfThreads).
Для получения дополнительной информации о настройке параметров параллельного выполнения прочитайте это.

Подробнее здесь: https://stackoverflow.com/questions/105 ... -processes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»