Task (TPL)

using System.Threading.Tasks; 

Бібліотека, що спрощує роботу з потоками

Ця бібліотека є більш рекомендованою ніж звичайні Thread

Перший task може запуститися в головному потоці

Синхронізація потоків аналогічна з Thread

Для запуску потрібен Start

Task task = new Task( () => Console.WriteLine("Task 1") );

task.Start();

Запускається автоматично

   1.

   Task task = Task.Run(() => F1());

   2.

   Task task = Task.Factory.StartNew(() => F1());

   3.

   await Task.Factory.StartNew(() => F1());

   4.

   Task.Factory.StartNew(() => F1());

   list.Add(Task.Factory.StartNew(() => F1()));

Зачекати на виконання task

   task1.Wait();           // очікує на закінчення task1

   task1.Wait(1000);    // очікує 1 c, TimeSpan

   Task.WaitAll(task1, task2);

   Task.WaitAll(taskArr);

   Task.WaitAll(list.ToArray());

   Task.WaitAny(list.ToArray());     // очікує поки не закінчиться один з тасків

Отримати результат виконання методу

var awaiter1 = task1.GetAwaiter();

var result = awaiter1.GetResult();

Коли завершиться

awaiter1.OnCompleted(() => {var awaiter1 = task1.GetAwaiter(); F1(awaiter1); });

Затримка

=> { await Task.Delay(1000); }

Status: WaitingToRun чи RanToCompletion

AsyncState: повертає об'єкт стану завдання

CurrentId: повертає ідентифікатор поточного завдання

Exception: повертає об'єкт виключення, що виник при виконанні завдання

AsParallel працює повільніше, але не їсть багато ресурсів (рекомендовано!)

Для 3-х операцій

Enumerable.Range(0, 3).AsParallel().ForAll(

     x =>

     { MessageBox.Show(list[x]); }

);

Для списку

list.AsParallel().ForAll(

     x =>

     { MessageBox.Show(x); }

);

Parallel працює швидко, але їсть багато ресурсів

Parallel.Invoke(

     () => 

     { MessageBox.Show("1");},

     () => 

     { MessageBox.Show("2"); },

     () => 

     { MessageBox.Show("3"); }

);

Або 

Parallel.For(0, 5, x =>

     { MessageBox.Show(list[x]); }

); 

Або 

Parallel.ForEach(list, x =>

     { MessageBox.Show(x); }

);

Вкладені "таски"