Обнаружить остановившийся BackgroundWorker в C # - PullRequest
1 голос
/ 15 июня 2009

Я использую объекты backgroundworker для предварительной асинхронизации и многопоточности, где это необходимо. Время от времени, когда я запускаю фоновщика, он останавливается в середине бега и не заканчивается. Обычно это происходит, когда я запускаю более одного фонового работника одновременно.

Когда я остановлюсь, я хочу отменить операцию и запустить ее заново. Моя проблема в том, что я не знаю, как определить, когда он остановился. Есть ли какой-то код, который мне нужно добавить, чтобы «уведомить», что работник остановился, или нет способа узнать?

Спасибо

Ответы [ 2 ]

4 голосов
/ 15 июня 2009

Вы должны отладить свой код и выяснить, почему он останавливается .

  • У вас есть многопоточный тупик?
  • Исчерпаны ли пулы ресурсов?
  • Вы ждете бесконечно на сетевом ресурсе?
  • Исключение выбрасывается в середине процесса?

BackgroundWorker предоставляет следующий обратный вызов:

  • DoWork, который вызывается перед началом вашей работы.
  • RunWorkerCompleted, который вызывается, когда ваша работа завершена.

Вы можете расширить это с помощью оболочки, чтобы записывать предупреждение, если действие занимает больше определенного времени, если вы хотите установить какой-то уровень обслуживания для асинхронных действий. (Например, запустить таймер, когда вызывается DoWork, и когда таймер истекает, зарегистрируйте предупреждение, сбросьте таймер после завершения)

2 голосов
/ 15 июня 2009

Это полностью зависит от того, что вы подразумеваете под «застопорился». Если вам удалось заблокировать рабочий поток, вам нужно будет найти проблему и устранить неполадку. Если оно вызывает исключение, то должно сработать событие RunWorkerCompleted с ненулевым Error в аргументах события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...