这是一些我有时不得不编写的代码,主要与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”标志可防止冗余或可能无限的事件调用。虽然我并不总是这样做(因为存在明显的危险),但有时它是一个有用的解决方案,但我不知道该如何称呼它。缺乏更好的术语,我一直在使用“软锁”。真正的名称是什么?
编辑: 是的,我知道它不是线程安全的等等。这是一个命名问题,而不是设计问题。但既然值得讨论… 代码改进:比此模式更好的替代方案?
IsEventHandling
后,可能会立即发生上下文切换。但如果是与用户界面相关的代码,则可能没问题,因为它将是用户界面线程引发事件。 - dlev