這裏有一些我必須寫的代碼,主要是和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