2011-08-31 7 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'을 테스트 한 직후 컨텍스트 스위치가있을 수 있습니다. 그러나 UI와 관련된 경우 이벤트를 발생시키는 UI 스레드이므로 괜찮을 것입니다. – dlev

+8

안전하지 않습니다. 그래서이 패턴을 "DontUse"라고해야한다고 생각합니다 :-) –

+0

'MyEvent'를 다시 호출하는 이벤트에 대한 부분을 "프로그래머가 조이면"이라고 확신합니다 ... – NotMe

답변

1

... 논의 가치가 있기 때문에 그러나 나는이 부울 변수 뭔가에 Semaphore, 즉 : 찾고 액세스 다소 관련이있다 생각합니다.

편집 : 질문의 주석에서 지적했듯이이 "패턴"은 threadsafe, exception-safe 및 good이 아니기 때문에 피해야합니다.

+4

나는 그것이 개인적으로 세마포어와 같다고 생각하지 않습니다.하나는 실제 동기 기본 요소이고, 다른 하나는 단지 부울 및기도입니다. –

+0

나는 그것을 말하지 않았다 ** ** 세마포어 - 원시적 인 하나 - 그러나 그것은 더 비슷하게 보이는 것이다. –

+0

당신이 세마포어라고 말하지 않았다는 것을 알고 있습니다. 사용법과 비슷하다고 생각하지 않습니다. –

3

이미 디자인에 대해 많이 언급되어 있습니다 (스레드로부터 안전하지 않음 등).

당신은 이름을 묻는 것 같아요 ... 널리 퍼지면 모르겠지만 몇 번이나 재진입 센티넬이라고 들었습니다.

+3

주제를 고수해 주셔서 감사합니다. –

관련 문제