BackgroundWorker утилизировать, прежде чем он сможет выполнить? - PullRequest
0 голосов
/ 19 октября 2011

Я пытаюсь найти действительно странную ошибку в своем приложении, и, ища ее, я столкнулся с сомнением о том, как работает BackgroundWorker.

Если у меня есть код, который выглядит следующим образом:

var bg = new BackgroundWorker();
bg.DoWork += MyHandler;
bg.RunWorkerAsync

Есть ли в любом случае, что это никогда не будет работать? Я имею в виду, что bg выходит из области видимости и требует BG, прежде чем он сможет получить шанс на запуск.

Может ли это случиться?

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Если в следующей строке произойдет исключение, вероятно, DoWork не будет вызван. Но я не думаю, что это твоя проблема. В противном случае нет, RunWorkerAsnyc будет запускать выполнение любым способом, GC также не будет очищать экземпляр, если у вас больше нет ссылок на ваш BackgroundWorker. Проверьте свойство AsyncCompletedEventArgs.Error , чтобы узнать, не произошло ли исключение в обработчике событий DoWork.

1 голос
/ 19 октября 2011

Нет, потому что RunWorkerAsync должен запустить новый поток!

1 голос
/ 19 октября 2011

Нет, тот факт, что вы назвали RunWorkerAsync, «ставит в очередь» работу для выполнения в отдельном потоке, поэтому есть ссылка на вашего работника, кроме той, которая была у вас.Если что-то хранит ссылку на работника, то работник не будет утилизирован.Чтобы быть более точным: экземпляр потока, выполняющий работника, должен иметь дескриптор, чтобы получить доступ к рабочему состоянию (что предотвращает удаление работника после того, как он покидает вашу область видимости).

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

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