Код 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 () (форми можна змінювати в іншому потоці).