Язык программирования 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()
async
static <b>async</b> Task Main(string[] args)
{
...
string message = await DoWorkAsync();
Conole.WriteLine(message);
...
}
На заметку! Возможность декорирования метода
Main()
async
Обратите внимание на ключевое слово
await
async
await
Кроме того, вы должны применять класс
Task
System.Threading.Tasks
Main()
Main()
DoWork()
DoWorkAsync()
string
Task<T>
Т
Реализация метода
DoWorkAsync()
Task<T>
Task.Run()
Run()
Func<>
Action<>
DoWorkAsync()
При вызове запускается новая задача, которая заставляет вызывающий поток уснуть на пять секунд. После завершения вызывающий поток предоставляет строковое возвращаемое значение. Эта строка помещается в новый объект Task<string>
Благодаря новой реализации метода
DoWorkAsync()
await
Task
await
Completed
Done with work!
DoWorkAsync()
Класс SynchronizationContext и async/await
Тип
SynchronizationContext
Цель модели синхронизации, реализуемой классом SynchronizationContext