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); }
);