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