Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Приостановка цикла нажатием кнопки

На форме имеется две кнопки.
По нажатию первой запускается цикл, который может работать довольно большой промежуток времени. Нажатие второй должно приостановить цикл.
Каким образом можно добиться такого поведения? Ведь цикл работает в обработчике первой кнопки.
Как же циклу дать знать, что была нажата кнопка "Стоп"?
Вот пример кода:
public void b1(object sender, EventArgs e) { for(int i = 0; i < 1000000; ++i) { ... } }
public void b2(object sender, EventArgs e) { ??? }


Ответ

Для начала: так не пойдёт.
Ваш цикл в обработчике события блокирует UI, и не даёт шанса отработать событиям от мыши. Кроме того, и всё приложение будет выглядеть зависшим.
Современный метод выполнения фоновых заданий с приостановкой — использование TPL: вам нужен Task и CancellationToken
CancellationTokenSource cts;
public async void b1(object sender, EventArgs e) { if (cts != null) return; using (cts = new CancellationTokenSource()) await Calculate(cts.Token); cts = null; }
public void b2(object sender, EventArgs e) { if (cts != null) cts.Cancel(); }
Task Calculate(CancellationToken ct) { return Task.Run(() => CalculateImpl(ct), ct); }
void CalculateImpl(CancellationToken ct) { for (int i = 0; i < 1000000; ++i) { if (ct.IsCancellationRequested) return; // ... } }

Комментариев нет:

Отправить комментарий