На форме имеется две кнопки.
По нажатию первой запускается цикл, который может работать довольно большой промежуток времени. Нажатие второй должно приостановить цикл.
Каким образом можно добиться такого поведения? Ведь цикл работает в обработчике первой кнопки.
Как же циклу дать знать, что была нажата кнопка "Стоп"?
Вот пример кода:
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;
// ...
}
}
Комментариев нет:
Отправить комментарий