C# Потоки

2075 / C# / Потоки

  • 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());

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

 

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