Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;Console.WriteLine(" Fun With Async ===>");Console.WriteLine(DoWork());Console.WriteLine("Completed");Console.ReadLine();static string DoWork(){ Thread.Sleep(5_000); return "Done with work!";}Вам известно, что после запуска программы придется ожидать пять секунд, прежде чем сможет произойти что-то еще. В случае графического приложения весь пользовательский интерфейс был бы заблокирован до тех пор, пока работа не завершится.
Если бы мы решили прибегнуть к одному из описанных ранее приемов, чтобы сделать приложение более отзывчивым, тогда пришлось бы немало потрудиться. Тем не менее, начиная с версии .NET 4.5, можно написать следующий код С#:
...string message = await DoWorkAsync();Console.WriteLine(message);...static string DoWork(){ Thread.Sleep(5_000); return "Done with work!";}static <b>async Task</b><string> DoWorkAsync(){ return <b>await</b> Task.Run(() => { Thread.Sleep(5_000); return "Done with work!"; });}Если вы используете в качестве точки входа метод
Main()asyncstatic <b>async</b> Task Main(string[] args){ ... string message = await DoWorkAsync(); Conole.WriteLine(message); ...}На заметку! Возможность декорирования метода
Main()asyncОбратите внимание на ключевое слово
awaitasyncawaitКроме того, вы должны применять класс
TaskSystem.Threading.TasksMain()Main()DoWork()DoWorkAsync()stringTask<T>ТРеализация метода
DoWorkAsync()Task<T>Task.Run()Run()Func<>Action<>DoWorkAsync()При вызове запускается новая задача, которая заставляет вызывающий поток уснуть на пять секунд. После завершения вызывающий поток предоставляет строковое возвращаемое значение. Эта строка помещается в новый объект Task<string>
Благодаря новой реализации метода
DoWorkAsync()awaitTaskawaitCompletedDone with work!DoWorkAsync()Класс SynchronizationContext и async/await
Тип
SynchronizationContextЦель модели синхронизации, реализуемой классом SynchronizationContext