2012-12-26 4 views
5

스레딩 내가 가진 가정합니다. 다음에 일어날 일 : 처리가 완료되고 다른 이벤트가 시작되거나 새로운 이벤트가 즉시 실행되지만 새 스레드에서 시작됩니까?이벤트 및

+0

어떤 종류의 객체가'ethernet_adapter'입니까? –

+0

@JimMischel 제 3 자 라이브러리 유형 'ICaptureDevice'입니다. 나는 대답을 얻은 것 같아. – ren

답변

2

당신은 추측해서는 안됩니다. 유형 (ethernet_adapter 개체)에 의해 이벤트가 발생하는 방식에 따라 달라질 수 있습니다.

동기 동작 인 경우 현재 작업이 진행될 때까지 새 이벤트가 발생하지 않습니다.

비동기 작업 인 경우 새 이벤트가 즉시 발생합니다. (당신의 예에서와 같이)

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

너무 오래 처리 동기 가입자 모든 가입자에 걸쳐 내부 열거를 차단하는 것입니다 :

2

이것은 동기 작업입니다. 다른 스레드에서 발생하는 유일한 방법은 이벤트를 발생시키는 개체가 다른 스레드에서 수행하는지 또는 처리기에서 수행하는지 여부입니다. 이를 수행하는 방법은 여러 가지가 있지만 일반적으로 System.Threading.Tasks.Task을 사용하면 .NET 4를 사용하는 것이 좋습니다.

응용 프로그램을 어떻게 동작 시킬지주의 깊게 고려하십시오. 새 스레드에서 각 패킷을 처리하기 만하면 패킷이 잘못된 순서로 처리 될 수 있습니다. 이들을 큐에 넣고 그 시점에서 배경 스레드로 처리하도록 할 수 있습니다. 또는 아무것도하지 않아도됩니다.

0

다음과 같이 ThreadPool에서 전체 작업을 큐에 넣을 수 있습니다.

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

또는 당신은 모든 스레드에 대한 작업을 (.NET 4.0) 만들 수 있습니다.

+0

OP 질문과 어떻게 관련이 있습니까? – Tilak

+0

각 긴 처리 항목은 스레드 풀에 대기열 수 있으며 이에 따라 처리됩니다. 나는이 문제를 이해하기를 바랍니다. – paritosh

+0

"비동기 처리 방법"이 아니라 "동작이란 무엇입니까" – Tilak

0

은 아마 당신의 ethernet_adapter 클래스의 방법이있다. 그러나! 매번 다른 스레드에서 ethernet_adapter을 호출 할 경우 이후의 호출을 OnPacketArrived으로 차단할 수 없으므로 동시에 두 개의 긴 처리가 수행됩니다.

예를 들어, Socket 구현을 살펴보십시오. 비동기 메소드는 완료 콜백이 IOCP 스레드에서 호출되도록합니다 (IO ThreadPool에있는 모든 시간마다).