我有一个活动
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());
}
}
答案 0 :(得分:1)
是的,绝对,这不安全。如果线程池忙,可以在委托目标开始运行之前花费秒。对FireAndForget的第二次调用可以很容易地再次运行,比如OnActivityFinished,因为委托调用在第一次调用完成之前已经安排好了。即使TP不忙而你经常打电话给FaF也会有比赛。没有简单的方法来避免我看到的种族。