在一个类似的问题中:
这种模式叫什么?软锁定?
我在询问下面代码清单的模式名称。
这种模式叫什么?软锁定?
我在询问下面代码清单的模式名称。
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;
}
}
似乎大部分讨论都集中在为什么应该或不应该这样做,所以我认为本问题提供了更好的讨论场所,可以解决所有问题。如何更好/正确地处理此事呢?
_isHandled
声明为volatile
。或者更好的方法是,避免使用双重检查锁定,仅在lock
块内部检查_isHandled
。 - LukeHlock
块内部检查_isHandled
状态,那么有时候调用线程会被冻结,直到MyOtherPossiblyRecursiveMethod()
完成并且该块被解锁。最好在这里进行两次检查。 - Artemix