Task Parallel Library– цикли for та foreach

Багато персональних комп’ютерів та робочих машин мають багато ядер, які можна змусити працювати одночасно. В старіших версіях .NET Framework (до 4.0) потрібно було застосовувати класи, які потребували низькорівневої маніпуляції з потоками, синхронізаціями і т.д. На даний момент ця проблема вирішена і якщо ми маємо у своєму розпорядженні .NET Framework 4.0, то ми можемо застосувати нові типи даних для багатопотоковості та нові утиліти для діагностики.

Task Parallel Library

The Task Parallel Library (TPL) є набором типів в просторі імен the System.Threading та System.Threading.Tasks. Основною ціллю цих типів є спрощення у використанні паралелізму та черг в програмах. TPL використовує всі процесори, які є доступними в момент виконання, що робить програму дуже ефективною. Також використовуючи TPL ми можемо виставляти приорітети для виконання, скасовувати операції, керувати станом.

В даній статті я продемонструю як використовувати паралельні цикли For та ForEach.

Припустимо, що у вас є цикл, який ви хочете виконати в багатьох потоках:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ParallelProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
            List<String> someItems = new List<string>();
            someItems.Add("Hello");
            someItems.Add("World");
            someItems.Add("Another message");
            someItems.Add("Parallel");
            foreach (String s in someItems)
            {
                Console.WriteLine(s);
            }
         }
     }
}

Використовуючи статичний метод ForEach класу Parallel, лямбда вираз, ми можемо змінити наш код наступним чином:.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ParallelProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
            List<String> someItems = new List<string>();
            someItems.Add("Hello");
            someItems.Add("World");
            someItems.Add("Another message");
            someItems.Add("Parallel");
            Parallel.ForEach(someItems, s =>
            {
                Console.WriteLine(s);
            });
        }
     }
}

В цей метод я передав колекцію з елементами і другий параметр це анонімний метод (делегат, який вказує на метод). Коли запускається паралельний цикл, метод ForEach розбиває ваші елемент на частини, та запускає делегат в різних потоках.

Метод For

Так само в нашому розпорядженні є метод, який нам дозволяє виконати паралельний цикл For:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ParallelProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
             List<String> someItems = new List<string>();
             someItems.Add("Hello");
             someItems.Add("World");
             someItems.Add("Another message");
             someItems.Add("Parallel");
             for (int i = 0; i < someItems.Count;i++ )
             {
                 Console.WriteLine(someItems[i]);
             }
             Parallel.For(0, someItems.Count, i =>
             {
                 Console.WriteLine(someItems[i]);
             });
         }
    }
}

В коді наведено приклад використання звичайно циклу for, після якого йде виклик статичного методу For, який виконується в паралельних потоках.

Через певний період часу я напишу ще статті, в яких буду демонструвати використання інших засобів паралельного програмування з TPL. Всього найкращого! Smile

Advertisements

, ,

  1. Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: