Улучшения многопоточности.NET 4

Я услышал, что.NET, 4 команды добавили новые классы в платформе, которые делают работу с потоками лучше и легче.

В основном вопрос - то, что новые пути состоят в том, чтобы выполнить многопоточные задачи, добавленные в.NET 4 и для чего они разработаны, чтобы использоваться?

UPD: Только для прояснения я не ищу единственный способ идти параллельно задачи в.NET 4, я хочу узнать, которые являются новыми, добавленными, и если возможный, для чего ситуация была бы каждый из них подойти лучше всего..

28
задан Jon Seigel 15 May 2010 в 22:06
поделиться

3 ответа

Из-за отсутствия ответов я решил оценить ответы ниже, используя то, что я узнал .. { {1}} Как заявил @Scott, .NET 4 добавила библиотеку параллельных задач, которая добавляет ряд нововведений, новых методов и подходов к параллелизму.

  • В первую очередь следует упомянуть методы Parallel.For и Parallel.ForEach , которые позволяют разработчику обрабатывать несколько элементов в нескольких потоках. В этом случае Framework решит, сколько потоков необходимо, и когда создавать новые потоки, а когда нет.
    Это очень простой и понятный способ распараллелить существующий код и немного повысить производительность.
  • Другой способ, несколько похожий на предыдущие, - это использование расширителей PLINQ. Они берут существующее перечисление и расширяют его параллельными расширителями linq. Поэтому, если у вас есть существующий запрос linq, вы можете легко преобразовать его в PLINQ. Это означает, что все операции с перечисляемым PLINQ также будут использовать преимущества нескольких потоков и фильтрацию вашего списка объектов с использованием, например, предложения .Where , теперь будет выполняться в нескольких потоках!
  • Одним из самых больших нововведений в TPL является новый класс Task .В некотором смысле он может выглядеть как уже хорошо известный класс Thread , но он использует преимущества нового пула потоков в .NET 4 (который был значительно улучшен по сравнению с предыдущими версиями) и намного больше функциональнее, чем обычный класс Thread . Например, вы можете объединить задачи в цепочку, где задачи в середине цепочки начнутся только тогда, когда завершатся предыдущие. Примеры и подробное объяснение в скринкасте на Channel 9
  • Для улучшения работы с классами задач мы можем использовать BlockingCollection <> . Это отлично работает в ситуациях, когда у вас есть сценарий производитель-потребитель. У вас может быть несколько потоков, создающих некоторые объекты, которые затем будут потребляться и обрабатываться методами-потребителями. Это можно легко распараллелить и контролировать с помощью фабрики задач и коллекции блокировок. Полезный скринкаст с примерами из Channel 9
    . Они также могут использовать разные классы резервного хранилища (ConcurrentQueue, ConcurentStack, ConcurrentBag), которые являются потокобезопасными и отличаются друг от друга с точки зрения порядка элементов и производительности. Примеры и объяснения их в другом видео здесь
  • Еще одна новая вещь, которая была добавлена ​​(которая, вероятно, не является частью TPL, но все равно помогает нам здесь), - это CountdownEvent class, который может помочь нам в «сценариях согласования задач» (c). В основном позволяет нам дождаться завершения всех параллельных задач.Скринкаст с примером использования на канале 9

Вы можете увидеть несколько скринкастов и видео на канале 9, которые помечены тегом «Параллельные вычисления»

36
ответ дан 28 November 2019 в 03:11
поделиться

Да, .NET 4 добавила Task Parallel Library , которая на высоком уровне добавляет поддержку:

  • параллельного выполнения циклы с Parallel.For и Parallel.ForEach
  • создают или запускают задачи с помощью Parallel.Invoke или класса Task
  • PLINQ ( parallel LINQ to Objects)

Отвечая на обновление исходного вопроса ...

TPL - это предпочтительный способ написания параллельных задач с использованием .NET 4. Вы по-прежнему можете создавать элементы пула потоков самостоятельно, и выполняйте все те же «ручные» методы работы с потоками, которые вы могли раньше.Следует иметь в виду, что весь пул потоков (и почти все, что связано с потоками) был переписан, чтобы использовать преимущества TPL. Это означает, что даже если вы сами создаете элемент пула потоков, вы все равно будете использовать TPL, даже если вы этого не знаете. Еще нужно иметь в виду, что TPL гораздо более оптимизирован и будет более правильно масштабироваться в зависимости от количества доступных процессоров.

Что касается знания того, для какой ситуации каждый из них лучше всего подходит, ответа «серебряной пули» не существует. Если вы ранее ставили в очередь свой собственный элемент пула потоков (или иным образом выполняли что-то многопоточное), вы можете изменить эту часть своего кода, чтобы использовать TPL без каких-либо последствий.

Для таких вещей, как параллельные циклы или параллельные запросы, вам нужно будет проанализировать код и выполнение этого кода, чтобы определить, уместно ли его распараллеливать.

15
ответ дан 28 November 2019 в 03:11
поделиться

Строго говоря, это C # 4.0, а не новый класс, но события теперь имеют более умную форму блокировки , которая, если я правильно понял изменение, устраняет необходимость в повторении кода блокировки, как показано ниже ( взято из этой статьи Джона Скита):

SomeEventHandler someEvent;
readonly object someEventLock = new object();

public event SomeEventHandler SomeEvent
{
    add
    {
        lock (someEventLock)
        {
            someEvent += value;
        }
    }
    remove
    {
        lock (someEventLock)
        {
            someEvent -= value;
        }
    }
}
1
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: