То, как вы справляетесь с этим, во многом зависит от того, нужно ли фоновому потоку сообщать что-либо основному потоку после его завершения. Если фоновым потоком действительно является «запустить и забыть», то нет особой причины, по которой вам нужно поддерживать ссылку на наблюдателя. Чтобы вы могли написать:
while loop
{
if(criteria)
{
BackgroundWorker observer = new BackgroundWorker();
observer.DoWork += new DoWorkEventHandler(observer_DoObserving);
observer.RunWorkerAsync();
}
}
Нить делает свою работу и уходит. observer
- это локальная переменная, которая выходит из области видимости, когда выполнение покидает блок if
. Переменная будет перезаписана только в том случае, если вам нужно запустить еще один поток наблюдателя до завершения первого.
Если вам нужно отслеживать информацию для отдельных наблюдателей, вы должны создать объект некоторого типа (определяемый вами класс), который содержит информацию о состоянии работника, и передать его в метод RunWorkerAsync
. Затем работник может изменить этот объект и отправить вам уведомления о ходе выполнения (см. Событие ProgressChanged
и метод ReportProgress
), а также сообщить о состоянии после завершения работы работника (см. RunWorkerCompleted
, объект состояния, который вы передали RunWorkerAsync
будет в собственности RunWorkerCompletedEventArgs.UserState
.