这里有一些我必须写的代码,主要是和UI的东西结合在一起,并且总是会偶然地发生无限循环的事件。这种模式叫什么?软锁?
public class MyClass
{
public event EventHandler MyEvent;
private bool IsHandlingEvent = false;
public MyClass()
{
MyEvent += new EventHandler(MyClass_MyEvent);
}
void MyClass_MyEvent(object sender, EventArgs e)
{
if (IsHandlingEvent) { return; }
IsHandlingEvent = true;
{
// Code goes here that handles the event, possibly invoking 'MyEvent' again.
// IsHandlingEvent flag is used to avoid redundant processing. What is this
// technique, or pattern called.
// ...
}
IsHandlingEvent = false;
}
}
正如你所看到的,使用标志“IsHandlingEvent”是用来防止重复,或可能不已事件的调用。虽然我并不总是这样做(因为有明显的危险),但有时候这是一个有用的解决方案,但我不知道该怎么称呼它。由于缺乏更好的术语,我一直在使用“软锁”。真名是什么?
编辑:
是的,我知道这是不是线程安全的,等等,这是一个名字的问题,而不是设计问题。但由于它是值得商榷...
Code improvement: Better alternatives to this pattern?
请注意,此代码不是线程安全的。在一个线程测试“IsEventHandling”之后,可能会立即切换上下文。但是,如果它与用户界面相关,那么它可能就没问题了,因为它将会引发事件。 – dlev
也不是例外安全的。所以我认为这种模式应该被称为“DontUse”:-) –
我很确定再次调用'MyEvent'事件的部分被称为“程序员搞砸了”... – NotMe