从事件中删除委托 - 导致同步问题?

时间:2010-08-17 04:13:06

标签: c#

我有一个活动

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
}

如下所示,异步调用事件中的委托。如果委托从上面给出的事件中删除,是否会导致同步问题? 请帮帮我

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 个答案:

答案 0 :(得分:1)

是的,绝对,这不安全。如果线程池忙,可以在委托目标开始运行之前花费。对FireAndForget的第二次调用可以很容易地再次运行,比如OnActivityFinished,因为委托调用在第一次调用完成之前已经安排好了。即使TP不忙而你经常打电话给FaF也会有比赛。没有简单的方法来避免我看到的种族。