Клас завдання
Клас Завдання — це асинхронна абстракція операцій, надана після .NET 4.0, з повним шляхом до System.Threading.Tasks.Task.
Клас Завдання використовується для представлення асинхронних операцій без поверненого значення, а для асинхронних операцій із поверненими значеннями слід використовувати підклас Завдання класу Завдання.<TResult> Завдання, створені класом Завдання, додаються до пулу потоків.
<TResult>Основні конструктори класу Завдання/Завдання такі:
Після створення завдання можна запустити за допомогою методу Start():
У фактичній розробці статичний метод Run() класу завдань або метод StartNew() класу TaskFactory частіше використовуються для створення та запуску нових завдань.
Деякі поширені методи класу Завдання:
async/await ключове слово
C# 5.0 запровадила ключові слова async і await, які забезпечили кращу підтримку конкурентності на мовному рівні.
Async використовується для позначення асинхронних методів: Асинхронне ключове слово є контекстуальним ключовим словом і розглядається як ключове слово лише при зміні методу та Лямбда, а також як ідентифікатор в інших сферах. Асинхронне ключове слово може позначати статичні методи, але не точки входу (методи Main()).
Повернене значення методу, позначеного async, має бути <TResult>значенням Завдання, Завдання або порожнеча. Await використовується для очікування результату асинхронного методу:
Ключове слово await також є контекстуальним і вважається ключовим словом лише в асинхронному методі з тегами. Ключове слово await можна використати перед асинхронним методом і Task і <TResult>Task для очікування завершення виконання асинхронного завдання. Проста асинхронна структура методу виглядає так:
Метод не позначається асинхронним ключовим словом, це асинхронний метод, і оператори, які з'являються безпосередньо всередині асинхронного методу, також виконуються синхронно,Контент, виконаний асинхронно, має виконуватися за допомогою класу Завдання。 Насправді, асинхронний метод, який не містить жодних операторів очікування, буде виконаний синхронно, після чого компілятор видасть попередження.
Простий приклад, використання async/await для одночасного виводу контенту на екрані:
Вихід: (Mono 4.4.0 та ArchLinux x64)
З наведеної вище програми неважко побачити, що в асинхронному методі асинхронного ключового слова з тегами код до використання await виконується синхронно, а після виклику await решта коду виконується асинхронно в окремому потоці.
|