以下是我必须编写的一些代码,主要是与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?
答案 0 :(得分:3)
已经有很多关于设计的说法(不是线程安全等)。
你似乎要求一个名字......不知道这是否广为流传,但我多次听说这是一个可重入的哨兵。
答案 1 :(得分:1)
我认为这与Semaphore有些相关,即:使用布尔变量查看某些内容。
编辑:正如问题评论中所指出的那样,应避免使用这种“模式”,因为它不是线程安全的,异常安全且良好。