Определить фоновый рабочий RunWorkerCompleted анонимным методом? - PullRequest
2 голосов
/ 27 февраля 2009

Надеюсь, я использовал правильный термин

Я стремлюсь к чему-то вроде этого (я понимаю, что так не работает):

private bool someBool = false;

BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(DoLengthyTask);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
    ()=>
        {
            someBool = true;
            Logger.Info("Finished");
        }
)

Важной частью является RunWorkerCompletedEventHandler, определяемый в области действия исходного вызывающего, а также имеющий доступ к переменным вызывающего.

Возможно ли это? Будет ли это генерировать возможные условия гонки на someBool?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2009

Это не работает в вашем примере, так как полный делегат должен получить 2 параметра:

private bool someBool = false;

BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(DoLengthyTask);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        (sender, e)=>
                {
                        someBool = true;
                        Logger.Info("Finished");
                }
)
0 голосов
/ 27 февраля 2009

Все зависит от того, что еще использует bool.

В частности, действительно ли это bool поле (как предполагает «частное лицо»), или это переменная? Есть разница, поскольку вы можете пометить поле как volatile (но не переменную).

Однако мне кажется, что вы должны использовать синхронизацию, такую ​​как Monitor, возможно, с пульсацией и т. Д., Или ворота, такие как ManualResetEvent.

Без синхронизации или volatile, для другого потока возможно не видеть изменений в переменной - но мы действительно не можем сказать больше без другой половины кода ...

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