2011-01-19 3 views
7

라이브러리 클래스에서 일련의 이벤트를 발생시키고 싶지만 일부 이벤트 구독자가 무례하고 일부 이벤트를 처리하는 데 시간이 오래 걸려서 이벤트를 발생시키는 스레드를 차단할 수 있습니다. 나는 각 이벤트 인상 스레드 풀 스레드를 사용하여 모금 스레드를 보호 할 수 있다고 생각 : 이벤트에 하나의 가입자가있을 때BeginInvoke를 MulticastDelegate와 함께 사용할 수 있습니까?

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    DataPacketReceived.BeginInvoke(this, args, null, null); 
} 

잘 작동하지만 곧 두 번째 가입자가 도착하는대로, DataPacketReceived가된다 멀티 캐스트 대리자를 사용하고 "대리자는 하나의 대상 만 가져야합니다."라는 오류 메시지와 함께 인수 예외가 발생합니다. 별도의 스레드에서 이벤트를 발생시키는 쉬운 방법이 있습니까? 아니면 스레드를 시작한 다음 거기에서 이벤트를 발생시켜야합니까?

답변

11

나는 유사한 질문을 another site에서 발견했으며, 물론 Jon Skeet이 이에 답변했습니다.

if (packet != null && DataPacketReceived != null) 
{ 
    var args = new DataPacketEventArgs(packet); 
    var receivers = DataPacketReceived.GetInvocationList(); 
    foreach (EventHandler<DataPacketEventArgs> receiver in receivers) 
    { 
     receiver.BeginInvoke(this, args, null, null); 
    } 
} 
+2

수정하지만, 각 가입자에'BeginInvoke'를 호출하면 반드시 각각 별도의 스레드에서 실행되는 것을 의미하지 않습니다 : 내 시나리오를 위해, 나는 별도의 스레드에서 각 가입자에 대한 이벤트를 인상하기로 결정했습니다. 스레드 풀의 비즈니스입니다. – Ani

+1

지난 며칠 동안이 문제를 몇 번 살펴 봤습니다. '리시버'의 객체가 실제로 EventHandler 유형이 아니라는 점에 유의해야합니다. 이는 명시 적 캐스트입니다. –

관련 문제