Головна‎ > ‎C#‎ > ‎Додатково‎ > ‎

Task (TPL)

using System.Threading.Tasks; 
Бібліотека, що спрощує роботу з потоками
Ця бібліотека є більш рекомендованою ніж звичайні Thread



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

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



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

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

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

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

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


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


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

   task.Wait();  // ?
   Task.WaightAll(task1, task2);
   Task.WaightAll(taskArr);
   Task.WaightAll(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); }
);