2011-08-31 80 views
3

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

+6

請注意,此代碼不是線程安全的。在一個線程測試「IsEventHandling」之後,可能會立即切換上下文。但是,如果它與用戶界面相關,那麼它可能就沒問題了,因爲它將會引發事件。 – dlev

+8

也不是例外安全的。所以我認爲這種模式應該被稱爲「DontUse」:-) –

+0

我很確定再次調用'MyEvent'事件的部分被稱爲「程序員搞砸了」... – NotMe

回答

1

我想這是有些關聯的Semaphore,即:尋找訪問一些與布爾變量。

編輯:正如問題的評論所指出的,由於不是線程安全的,異常安全的和良好的,應該避免使用這種「模式」。

+4

我不會認爲它就像個信號量一樣。一個是實際的同步原語,另一個只是布爾和祈禱。 –

+0

我沒有說它**是一個信號量 - 原始信號 - 但它看起來更像一個相似的東西。 –

+0

我知道你沒有說它是一個信號量,我只是不認爲它甚至類似於使用中的一個。 –

3

關於設計已經有很多說(非線程安全等)。

你似乎在問一個名字......不知道這是否廣泛傳播,但我多次聽說這是一個重入哨兵。

+3

感謝您堅持話題。 –