Я услышал, что.NET, 4 команды добавили новые классы в платформе, которые делают работу с потоками лучше и легче.
В основном вопрос - то, что новые пути состоят в том, чтобы выполнить многопоточные задачи, добавленные в.NET 4 и для чего они разработаны, чтобы использоваться?
UPD: Только для прояснения я не ищу единственный способ идти параллельно задачи в.NET 4, я хочу узнать, которые являются новыми, добавленными, и если возможный, для чего ситуация была бы каждый из них подойти лучше всего..
Из-за отсутствия ответов я решил оценить ответы ниже, используя то, что я узнал .. { {1}} Как заявил @Scott, .NET 4 добавила библиотеку параллельных задач, которая добавляет ряд нововведений, новых методов и подходов к параллелизму.
Parallel.For
и Parallel.ForEach
, которые позволяют разработчику обрабатывать несколько элементов в нескольких потоках. В этом случае Framework решит, сколько потоков необходимо, и когда создавать новые потоки, а когда нет. .Where
, теперь будет выполняться в нескольких потоках! Task
.В некотором смысле он может выглядеть как уже хорошо известный класс Thread
, но он использует преимущества нового пула потоков в .NET 4 (который был значительно улучшен по сравнению с предыдущими версиями) и намного больше функциональнее, чем обычный класс Thread
. Например, вы можете объединить задачи в цепочку, где задачи в середине цепочки начнутся только тогда, когда завершатся предыдущие. Примеры и подробное объяснение в скринкасте на Channel 9 BlockingCollection <>
. Это отлично работает в ситуациях, когда у вас есть сценарий производитель-потребитель. У вас может быть несколько потоков, создающих некоторые объекты, которые затем будут потребляться и обрабатываться методами-потребителями. Это можно легко распараллелить и контролировать с помощью фабрики задач и коллекции блокировок. Полезный скринкаст с примерами из Channel 9 CountdownEvent
class, который может помочь нам в «сценариях согласования задач» (c). В основном позволяет нам дождаться завершения всех параллельных задач.Скринкаст с примером использования на канале 9 Вы можете увидеть несколько скринкастов и видео на канале 9, которые помечены тегом «Параллельные вычисления»
Да, .NET 4 добавила Task Parallel Library , которая на высоком уровне добавляет поддержку:
Parallel.For
и Parallel.ForEach
Parallel.Invoke
или класса Task
Отвечая на обновление исходного вопроса ...
TPL - это предпочтительный способ написания параллельных задач с использованием .NET 4. Вы по-прежнему можете создавать элементы пула потоков самостоятельно, и выполняйте все те же «ручные» методы работы с потоками, которые вы могли раньше.Следует иметь в виду, что весь пул потоков (и почти все, что связано с потоками) был переписан, чтобы использовать преимущества TPL. Это означает, что даже если вы сами создаете элемент пула потоков, вы все равно будете использовать TPL, даже если вы этого не знаете. Еще нужно иметь в виду, что TPL гораздо более оптимизирован и будет более правильно масштабироваться в зависимости от количества доступных процессоров.
Что касается знания того, для какой ситуации каждый из них лучше всего подходит, ответа «серебряной пули» не существует. Если вы ранее ставили в очередь свой собственный элемент пула потоков (или иным образом выполняли что-то многопоточное), вы можете изменить эту часть своего кода, чтобы использовать TPL без каких-либо последствий.
Для таких вещей, как параллельные циклы или параллельные запросы, вам нужно будет проанализировать код и выполнение этого кода, чтобы определить, уместно ли его распараллеливать.
Строго говоря, это C # 4.0, а не новый класс, но события теперь имеют более умную форму блокировки , которая, если я правильно понял изменение, устраняет необходимость в повторении кода блокировки, как показано ниже ( взято из этой статьи Джона Скита):
SomeEventHandler someEvent;
readonly object someEventLock = new object();
public event SomeEventHandler SomeEvent
{
add
{
lock (someEventLock)
{
someEvent += value;
}
}
remove
{
lock (someEventLock)
{
someEvent -= value;
}
}
}