Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
-9
02:08, 18 августа 2015

Параллельное программирование.

Все, кто программирует на C#, так или иначе использовали оператор foreach.

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

Но, что, если нам необходимы длительные вычисления над элементами последовательности и полученные результаты не зависят друг от друга?

В .NET Framework 4 появились интересные возможности параллельности: Parallel.ForEach и Parallel LINQ (PLINQ).

* В этой статье я не рассматриваю такие вещие как async-await  и другие вещи, касающиеся .NET Framework 4.5.

Простейший форма метода ForEach выгляди следующим образом:


  1. public static ParallelLoopResult ForEach<TSource>(IEnumerable<TSource> source, Action<TSource> body)
  2. {
  3. if (source == null)
  4. {
  5. throw new ArgumentNullException("source");
  6. }
  7. if (body == null)
  8. {
  9. throw new ArgumentNullException("body");
  10. }
  11. return ForEachWorker<TSource, object>(source, s_defaultParallelOptions, body, null, null, null, null, null, null);
  12. }
 

#mce_temp_url#

Этот метод разбивает данные на части и оперирует над элементами в различных потоках.

Метод возвращает сведения о состоянии цикла.

Пример абстрактного коня в вакууме (как всегда - из рабочего проекта):

 

  1. public void Start()
  2. {
  3. Parallel.ForEach(_components,
  4. component =>
  5. {
  6. Console.WriteLine("Component loaded: {0}", component.Value.Description);
  7. foreach (var value in component.Value.Execute())
  8. _storage.Save(XElement.Parse(value));
  9. });
  10. }
 

В этом коде происходит вызов множества компонент (каждая компонента - сборка .NET), каждый из которых загружает множество Xml документов, и сохраняет их в некое абстрактное хранилище.

При этом сохранение происходит асинхронно, то есть без задержек.


  1. async Task Save(XElement message);
-9
505
2