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