2010-08-17 57 views
0

我有一個事件從事件中刪除委託 - 導致同步問題?

this._sequencer.Completed 

兩名代表訂閱了這個

this._sequencer.Completed += OnActivityFinished; 
this._sequencer.Completed += OnCarrierReLoaded; 

是如下

void OnActivityFinished(object sender, EventArgs e) 
{ 
    // Do some activity 
    this._sequencer.Completed -= OnActivityFinished 
} 
void OnCarrierReLoaded(object sender, EventArgs e) 
{ 
    // Do some activity 
    this._sequencer.Completed -= OnCarrierReLoaded 
} 

給出的代表implemnetation

事件中的委託被調用爲異步調用,如下所示。 如果委託從上述事件中被移除,它是否會導致同步問題? 請幫我

void EventHelper::FireAndForget(Delegate^ d, ... array<Object^>^ args) 
{ 
    try 
    { 
     if (d != nullptr) 
     {           
      array<Delegate^>^ delegates = d->GetInvocationList(); 

      for each(Delegate^ delegateMethod in delegates) 
      { 
       try 
       {        

        DynamicInvokeAsyncProc^ evtDelegate = gcnew DynamicInvokeAsyncProc(this, &EventHelper::OnTriggerEvent); 
        evtDelegate->BeginInvoke(delegateMethod, args, _dynamicAsyncResult, nullptr); //FIX_DEC_09 Handle Leak    
       } 
       catch (Exception^ ex) 
       {       
       } 
      } 
     } 
     else 
     {     
     } 
    } 
    catch (Exception^ e) 
    {     
    } 
} 

void EventHelper::OnTriggerEvent(Delegate^ delegateMethod, array<Object^>^ args) 
{ 
    try 
    {     
     // Dynamically invokes (late-bound) the method represented by the current delegate. 
     delegateMethod->DynamicInvoke(args);     
    } 
    catch (Exception^ ex) 
    { 
     Log(LogMessageType::Error, "EventHelper.OnTriggerEvent", ex->ToString()); 
    } 
} 

回答

1

是的,當然,這不是安全的。如果線程池正忙,在代理目標開始運行之前可能需要。第二次調用FireAndForget可以輕鬆地運行,比如OnActivityFinished,因爲委託調用在第一次調用完成之前就已經安排好了。即使TP不忙,比賽也在那裏,你經常打電話給FaF。沒有簡單的方法來避免我看到的比賽。