Робота з backgroundworker c #

Код 3 форми (з таймером, прогрессбар і кнопкою скасування асинхронної операції):

UPD: Вирішив проблему, перенісши виклик ThirdForm в метод checkBox1_CheckedChanged після виклику Воркер. Біда була саме у виклику 3 форми з backgroundWorker1_DoWork. Всередині методів worker ці звернення працюють некоректно (по крайней мере, не так, як хотілося б). Однак залишилася інша проблема - кнопка скасування операції в Воркер з 3 форми не спрацьовує (просто нічого не відбувається). Поки не розумію, як коректно викликати завершення worker з іншої форми.

UPD2: Проблема з кнопкою вирішена наступним чином:

Зміни в коді на 3 формі:

Обробка в другій формі:

Форма повинна закритися або вивестися повідомлення про помилку (або MessageBox, або програма впаде). Помилка може не з'явитися, якщо виникла не в основному потоці (наприклад, якщо backgroundWorker1_RunWorkerCompleted спрацював в іншому потоці).

пропоную про всяк випадок вставити Invoke всередину цього методу

Заодно додав зайвий MessageBox, щоб переконатися, що backgroundWorker1_RunWorkerCompleted вобще спрацьовує.

Що стосується переривання BackgroundWorker за допомогою методу Abort (), як для Thread, то, на жаль, він його не підтримує. Звичайно ж робити Abort () небажано, тому що залишається мертвий Connection. Хоча збирач сміття його потім закриє.

Думаю є сенс повністю відмовитися від BackgroundWorker і все реалізувати на Thread, поміщаючи весь код роботи з інтерфейсом в Invoke () (форми можна змінювати в іншому потоці).

Схожі статті