Асинхронный код aka Многопоточность (Async/Await)

DOMINUS_EDEM

Местный житель
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА

DOMINUS_EDEM

Местный житель
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
ЮБИЛЕЙНАЯ ЛЕНТА
Регистрация
1 Июн 2018
Сообщения
1,099
Реакции
389
Репутация
1
Род занятий

Электронные кошельки, Пробив информации

Task Class - представляет одну операцию, не возвращающую значение, который обычно выполняется асинхронно. Если же вам будет необходимо возвращать значение, то используйте производный от него Task<TResult> Class.

Для создания асинхронного кода нам понадобятся модификатор async и оператор await:
-Модификатор async указывает, что метод, лямбда-выражение или анонимный метод является асинхронным;
-Оператор await применяется для вставки точки приостановки выполнения метода до завершения выполнения ожидаемой задачи.

Теперь стоит продемонстрировать работу с классом. Первым делом необходимо подключить сам класс:
C#:
using System.Threading.Tasks;
Так как оператор await может присутствовать только в асинхронном методе, нам необходимо определить метод, с которым мы работаем, как асинхронный.
Рассмотрим на примере кнопки (пишем async между private и void):
C#:
private async void button1_Click(object sender, EventArgs e)
ТЕЛО НАШЕЙ КНОПКИ:
Для примера мы будем отключать кнопку на время выполнения потока, а далее включать:
C#:
var b = sender as Button;
b.Enabled = false;
Создаём поток:

C#:
await Task.Factory.StartNew((() =>
{
    //Код потока
    //await -  приостанавливает выполнение метода, пока не завершится задача/task
    //Start.New - возвращает задачу/task
    //Тут идёт код программы
}));
И остаётся только включить кнопку после завершения работы нашего кода. И тут тоже есть маленький нюанс, если мы просто напишем b.Enabled = true;, то при выполнении нам выдаст:"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'button1' не из того потока, в котором он был создан", то же самое касается, если мы захотим вывести в label, например: label1.Text = "Готово!";. Необходимо создать новый делегат от имени:
C#:
b.Invoke(new Action(() => //Выполни от своего имени
{
    b.Enabled = true; //Управляем кнопкой
}));
ВЕСЬ КОД:
C#:
private async void button1_Click(object sender, EventArgs e)
{
    var b = sender as Button;
    b.Enabled = false;
    await Task.Factory.StartNew((() =>
    {
        Task.Delay(1000).Wait(); //Код программы (я просто поставил задержку)
        b.Invoke(new Action(() =>
        {
            b.Enabled = true;
        }));
    }));
}
 
Сверху