문제

루프의 큐에서 데이터를 수신하는 작업자 스레드가 포함된 클래스가 있습니다.

앱의 또 다른 부분은 이 클래스에서 이벤트를 싱크하며, 클래스는 각 대기열 항목에 대해 이벤트를 발생시킵니다.

이러한 이벤트는 비동기적으로 실행되므로 바쁜 시간에는 앱의 다른 부분이 여러 이벤트를 동시에 처리할 수 있습니다.

이는 문제가 없지만 이로 인해 문제가 발생할 수 있는 시나리오를 발견했습니다.

주요 문제가 해결되는 동안 빠른 해결책이 필요합니다.프레임워크는 각 이벤트가 처리되는 동안 작업자 스레드를 강제로 대기시켜 순차적으로 처리되도록 할 수 있는 간단한 방법을 제공합니까?그렇지 않다면 이를 구현하는 가장 쉬운 방법은 무엇입니까?

도움이 되었습니까?

해결책

간단한 대답은 이벤트 핸들러의 단일 객체에 대해 lock()을 수행하는 것입니다.모든 theads는 잠금을 얻기 위해 기다릴 것입니다.

다른 팁

그만큼 ManualResetEvent 클래스 귀하의 질문을 이해하지 못하는 한 여기에서 도움이 될 수 있습니다.이를 사용하여 마지막 이벤트가 완료될 때까지 다음 이벤트의 실행을 차단할 수 있습니다.

내 생각엔 이벤트를 발생시키고 메서드를 직접 호출하여 작업을 트리거하는 것에서 벗어나고 싶을 것입니다.

AFAIK 이벤트는 비동기식으로 진행되며 이를 변경하는 "쉬운" 방법을 알지 못합니다.

또 다른 대답이 있다는 것이 밝혀졌습니다.메소드에 다음 속성을 추가하면 됩니다.

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]

일반적인 방법은 없습니다.

결국 핸들러는 추적을 위한 메커니즘을 제공해야 합니다.

BeginInvoke를 사용하는 경우 이벤트를 직접 발생시키는 대신 래퍼를 사용하여 실제 이벤트 처리기를 동기적으로 호출한 다음 래퍼를 비동기적으로 발생시킬 수 있습니다.래퍼는 카운터(연동 작업 포함)를 유지하거나 필요에 따라 이벤트를 설정할 수 있습니다.

다음과 같은 것 :

TheDelegate realHandler = theEvent;
var outer = this;
ThreadPool.QuereUserWorkItem(x => {
  // Set start of handler
  realHandler(outer, eventArgs);
  // Set handler finished
};

큐 읽기 작업자 스레드에서 발생하는 모든 이벤트 핸들러 싱크 이벤트는 큐 읽기 작업자 스레드에서 호출됩니다.이벤트 핸들러가 자체 스레드를 생성하지 않는 한 큐 읽기 작업자 스레드에서 Thread.Join()을 호출하여 이벤트 핸들러가 완료될 때까지 기다릴 수 있어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top