Определить RunWorkerCompleted фонового работника анонимным методом?

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

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

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)

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

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

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

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

В вашем примере это не работает, поскольку полный делегат должен получить 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");
                }
)