инніВ» методу Wait (). p align="justify"> public static bool WaitAll (params Task [] tsk); static int WaitAny (params Task [] tsk);
Метод WaitAll () очікує завершення групи завдань, і повернення з неї буде проведений тільки тоді, коли будуть завершені всі завдання. Метод WaitAny () очікує завершення будь одного завдання із зазначених у параметрі tsk. Якщо під час виконання завдання сама згенерувала виняток, або її скасували, то буде згенерована виняткова ситуація AggregateException. Але слід зазначити, що вказані в даній роботі оголошення функція Wait (), WaitAll (), WaitAny () далеко не єдині. Існує кілька варіантів оголошення даних методів, де в параметрах можна вказувати період простою, відстежувати ознака скасування (буде розглянуто далі) і т.д. Дана група методів забезпечує досить гнучку систему очікування завершення завдань і, істотно, полегшує роботу програміста, скорочуючи обсяг коду багатопотокового додатку. p align="justify"> Часом ресурси, виділені на потік, необхідно використовувати до завершення програми, а в класі Thread В«збірка сміттяВ» здійснюється тільки по завершенні роботи програми. TPL вирішила дану задачу і дозволила звільняти ресурси вручну. У класі Task реалізований інтерфейс IDisposable, в якому визначається метод Dispose (). Void Dispose ();
Цей метод звільняє ресурси, використовувані класом Task. Але слід мати на увазі, що метод Dispose () можна застосувати лише до однієї задачі тільки після її завершення. Якщо застосувати дану функцію до активної задачі, то буде згенеровано виняток InvalidOperationException. Саме тому, щоб уникнути помилок, ефективним є використання методу Dispose () у зв'язці з методами Wait () (або WaitAll ()). p align="justify"> Новаторською особливістю бібліотеки паралельних завдань є можливість створювати продовження завдання. Завдання-продовження автоматично запуститься після завершення іншого завдання. Створити таке продовження можна за допомогою методу ContinueWith (), визначеного в класі TaskFactory. p align="justify"> public Task ContinueWith (Action cont_act);
Цей механізм досить зручний для запуску низки послідовно виконуються завдань. Більш того, метод ContinueWith () усуває необхідність очікування завершення завдання, яка згодом була продовжена. Існує й інші методи, визначені в класі TaskFactory, які дозволяють більш гнучко використовувати можливість продовження завдання. p align="justify"> public static Task ContinueWhenAny (Task [] tsk, Action cont_act); static Task ContinueWhenAll (Task [] tsk, Action cont_act);
Метод ContinueWhenAny () запускає нову задачу, як тільки завершилася одна із зазначених у параметрі tsk. А метод ContinueWhenAll () створює і починає виконання завдання лише тоді, коли завершилося виконання всіх завдань, перелічених у tsk. p align="justify"> І останнє нововведення TPL, на яке хотілося б звернути увагу - це підсистема скасув...