Существует проблема с этот ответ. UI должен продолжить обрабатывать сообщения, в то время как Вы ожидаете, иначе он не перекрасит, который будет проблемой, если Вашему второстепенному рабочему потребуется много времени для ответа на запрос отмены.
А второй дефект - то, что _resetEvent.Set()
никогда не будет называться, если рабочий поток выдаст исключение - отъезд основного потока, ожидающего неограниченно долго - однако, этот дефект мог легко быть зафиксирован с блоком попытки/наконец.
Один способ сделать это должно отобразить модальное диалоговое окно, которое имеет таймер, который неоднократно проверяет, закончил ли второстепенный рабочий работу (или закончил отменять в Вашем случае). Как только второстепенный рабочий закончил, модальное диалоговое управление возвратами к Вашему приложению. Пользователь не может взаимодействовать с UI, пока этого не происходит.
Другой метод (принимающий Вас имеют максимум одного немодального открытого окна) должен установить ActiveForm. Включенный = ложь, затем цикл на Приложении, DoEvents, пока второстепенный рабочий не закончил отменять, после которого можно установить ActiveForm. Включенный = верный снова.
Есть три группы коллекций.
Collections.synchronizedXxx()
методов Короче говоря, ни одна из коллекций, которые я бы порекомендовал вам использовать, не синхронизирована.