下面是一个例子:如何处理多线程中的竞态条件?
if (control.InvokeRequired)
{
control.BeginInvoke(action, control);
}
else
{
action(control);
}
如果条件和之间的BeginInvoke什么叫控制设置,例如?
具有事件做又如:
var handler = MyEvent;
if (handler != null)
{
handler.BeginInvoke(null, EventArgs.Empty, null, null);
}
如果MyEvent
是第一行,if语句,if语句仍然会执行之间退订。但是,这是适当的设计?如果取消订阅也会导致正确调用该事件所需的状态被破坏?这个解决方案不仅有更多的代码行(样板文件),而且它不那么直观,并且可能导致客户端的意外结果。
什么说你呢?
上面描述的用于事件处理程序的模式存在的原因是保持对处理程序的引用处于活动状态,因此无法处理。 –
@Mitch Wheat:是的,我并不是说处理程序必须处置,但是如果客户端退出事件,他或她也可能决定不再需要某种通常只由事件处理程序使用的状态对象。由于该事件仍然在退订后出现不幸的时机,因此可能很难追踪错误,因为预期的结果是处理程序在退订后不会运行。 –
@Mitch看到我的答案。 –