2011-08-31 105 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

感谢您坚持话题。 –