Task Class - представляет одну операцию, не возвращающую значение, который обычно выполняется асинхронно. Если же вам будет необходимо возвращать значение, то используйте производный от него Task<TResult> Class.
Для создания асинхронного кода нам понадобятся модификатор async и оператор await:
-Модификатор async указывает, что метод, лямбда-выражение или анонимный метод является асинхронным;
-Оператор await применяется для вставки точки приостановки выполнения метода до завершения выполнения ожидаемой задачи.
Теперь стоит продемонстрировать работу с классом. Первым делом необходимо подключить сам класс:
Так как оператор await может присутствовать только в асинхронном методе, нам необходимо определить метод, с которым мы работаем, как асинхронный.
Рассмотрим на примере кнопки (пишем async между private и void):
ТЕЛО НАШЕЙ КНОПКИ:
Для примера мы будем отключать кнопку на время выполнения потока, а далее включать:
Создаём поток:
И остаётся только включить кнопку после завершения работы нашего кода. И тут тоже есть маленький нюанс, если мы просто напишем b.Enabled = true;, то при выполнении нам выдаст:"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'button1' не из того потока, в котором он был создан", то же самое касается, если мы захотим вывести в label, например: label1.Text = "Готово!";. Необходимо создать новый делегат от имени:
ВЕСЬ КОД:
Для создания асинхронного кода нам понадобятся модификатор async и оператор await:
-Модификатор async указывает, что метод, лямбда-выражение или анонимный метод является асинхронным;
-Оператор await применяется для вставки точки приостановки выполнения метода до завершения выполнения ожидаемой задачи.
Теперь стоит продемонстрировать работу с классом. Первым делом необходимо подключить сам класс:
C#:
using System.Threading.Tasks;
Рассмотрим на примере кнопки (пишем 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
//Тут идёт код программы
}));
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;
}));
}));
}