2009-02-27 2 views
2

Я надеюсь, я использовал правильный терминОпределить RunWorker рабочего стола с анонимным методом?

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

private bool someBool = false; 

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

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

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

+0

Что еще обращается к BOOL? Это необходимо для понимания возможных условий гонки ... –

+0

Вещи в основной теме получат доступ к bool. В этом (фиктивном) примере может случиться так, что позднее в логгер может быть добавлена ​​определенная строка. –

ответ

3

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

Хотя это правда, я не уверен, что все равно будет отвечать на фактический вопрос (ы) ... –

+0

Теперь остается только проблема условий гонки. –

0

Это все зависит от того, что еще использует логическое значение.

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

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

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

+0

Боюсь, что другой половины нет. Это был фиктивный пример в попытке разбить большую проблему, которую я не могу решить на более мелкие проблемы. Для всего изображения, пожалуйста, обратитесь к http://stackoverflow.com/questions/594230/wait-for-two-threads-to-finish/594238#594238 –

Смежные вопросы