Всем Хай! Выкладывал на другом борде небольшую статью по работе с многопоточностью на языке программирования C#. В данной статье мы рассмотрим класс, который облегчит работу с многопоточностью и предоставит удобство в использовании. Для нашей задачи мы будем использовать класс Task.
Для создания асинхронного кода нам понадобятся модификатор async и оператор await:
-Модификатор async указывает, что метод, лямбда-выражение или анонимный метод является асинхронным;
-Оператор await применяется для вставки точки приостановки выполнения метода до завершения выполнения ожидаемой задачи.
Теперь стоит продемонстрировать работу с классом. Первым делом необходимо подключить сам класс:
Так как оператор await может присутствовать только в асинхронном методе, нам необходимо определить метод, с которым мы работаем, как асинхронный.
Рассмотрим на примере кнопки (пишем async между private и void):
ТЕЛО НАШЕЙ КНОПКИ:
Для примера мы будем отключать кнопку на время выполнения потока, а далее включать:
Создаём поток:
И остаётся только включить кнопку после завершения работы нашего кода. И тут тоже есть маленький нюанс, если мы просто напишем b.Enabled = true;, то при выполнении нам выдаст:"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'button1' не из того потока, в котором он был создан", то же самое касается, если мы захотим вывести в label, например: label1.Text = "Готово!";. Необходимо создать новый делегат от имени:
ВЕСЬ КОД:
Избавляемся от Invoke:
-Братан, что это такое? ((() => }));
-Лямбда-выражения -
Автор урока: Mathian Developer aka Лев Попов
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
- представляет одну операцию, не возвращающую значение, который обычно выполняется асинхронно. Если же вам будет необходимо возвращать значение, то используйте производный от него
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
.Для создания асинхронного кода нам понадобятся модификатор 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;
}));
}));
}
C#:
private async void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
await Task.Run((() =>
{
Task.Delay(1000).Wait(); // Имитация работы.
}));
button1.Enabled = true;
}
-Лямбда-выражения -
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Автор урока: Mathian Developer aka Лев Попов
Последнее редактирование: