2013-09-03 4 views
3

C#/.NET에서 이벤트 주문에 대한 빠른 질문이 있습니다..NET에서 이벤트 주문

소켓 인터페이스 (TCP)를 읽는 while 루프가 있다고 가정 해 보겠습니다. 인터페이스가 확실히 순서를 처리하고 있습니다 (TCP입니다). 패킷 인터페이스가 작성되어 스트림에있는 각 "패킷"이 작성되면 이벤트 콜백을 통해 다음 "계층"또는 다음 객체로 전달합니다.

while (1) { 
    readsocket(); 
    if (data received = complete packet) 
     raiseEvent(packet); 
} 

내 질문

은 다음과 같습니다 :

  1. 은 이벤트가 순서대로 발생 그래서 여기

    은 의사입니까? (즉, 주문 유지)

  2. # 1은 정확하다고 가정하므로 처리가 완료 될 때까지 while 루프를 차단합니까?
+3

단일 스레드? 예. –

+1

예, while (1)이 유일한 루프이고 하나의 이벤트 리스너 만 있다고 가정합니다. raiseEvent는 하드 블록을 수행합니다 (즉, 다른 소켓 데이터를 읽지 못하게합니다). 또는 본질적으로 이벤트에 대한 별도의 스레드를 생성합니다. 나는 그것이 하드 블록을한다고 짐작하고있다. – Tony

+1

대답이 아니지만 [BlockingCollection] (http://msdn.microsoft.com/en-us/library/dd997371.aspx) ''은이 루프를 사용하는 작업자와 분리하는 훌륭한 솔루션입니다 . –

답변

6

이벤트가 어떻게 구현되는지 알 수 없습니다. 이벤트가 모두 동기식으로, 순서대로, 그리고 의미있는 가치에 따라 실행될 수 있습니다. 또한 임의적이고 일관성없는 순서로 동 기적으로 실행될 수도 있습니다. 또한 동 기적으로 실행되지 않으며 다양한 이벤트 처리기가 새 스레드 (또는 스레드 풀 스레드)에서 실행될 수도 있습니다. 모든 것을 결정하는 것은 이벤트의 구현에 전적으로 달려 있습니다.

서로 다른 이벤트 처리기가 병렬로 실행되는 것을 보는 것은 드문 일입니다. (그리고 매우 희귀 함을 의미합니다.) 거의 모든 이벤트는 단일 멀티 캐스트 대리인에 의해 지원됩니다. 해고 될 순서는 그들이 추가 된 순서이지만, 사실인지 여부를 실제로 알 수있는 방법이 없습니다 (코드 디 컴파일). 그것이 어떻게 구현되는지 공개 API로부터 알 수 없습니다.

개념적 관점에서 보면 이벤트 핸들러 호출의 순서에 의존하지 않는 것이 가장 좋으며 일반적으로 다양한 이벤트 처리기가 동시에 실행될 수있는 것처럼 프로그래밍하는 것이 가장 좋습니다 레벨, 즉 구현 세부 사항이 더 제한적인 경우에도 이벤트가 나타내는 것입니다.

+0

Servy - while 루프가 이벤트를 호출하는 유일한 사람이고 하나의 이벤트 리스너 만 있다고 가정합시다. 이벤트 리스너가 이벤트 리스너를 배열에 저장한다고 가정 해 보겠습니다. 그럴 경우, 순서대로 진행될 것인가? (나는 그것이 카운터로 간단한 테스트를했기 때문이라고 생각한다.)하지만 더 중요한 것은 이벤트가 실행되는 동안 while 루프를 블로킹하겠습니까? – Tony

+0

@ 토니 대부분의 이벤트는 사실과 같은 방식으로 구현됩니다. 다른 일을하는 구현체를 찾는 것은 매우 어렵지만, 가능한 가장 확실한 방법이며, 사실인지 아닌지를 알 수있는 방법이 없습니다. 그것은 효과가있을 수도 있고 그렇지 않을 수도 있습니다. 당신은 알 길이 없습니다. – Servy