在一個類似的問題:
What is this pattern called? Soft Lock?代碼改進:更好地替代這種模式?
我問了下面的代碼上市模式的名稱。
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;
}
}
看來,大部分談話是圍繞爲什麼要一個不應該做這樣的中心,所以我覺得這個問題提供了一個更好的論壇來解決這個問題,並解決所有的問題。處理這個問題的更好/正確的方法是什麼?
如果re-rais發生在同一個線程上(這是A.R.所討論的場景),你確定這個鎖是否可用? –
你可能也想讓'_isHandled'變成volatile。或者,更好的辦法是避免重複檢查鎖定,只檢查'lock'塊內的'_isHandled'。 – LukeH
@LukeH如果你檢查'lock'塊中的_isHandled狀態,有時調用線程將被凍結,直到'MyOtherPossiblyRecursiveMethod()'完成並且塊被解鎖。在這裏檢查兩次會更好。 – Artemix