StaTaskScheduler 및 메시지 펌핑
StaTaskScheduler는 ParallelExtensionsExtras 라이브러리의 일부이며 이를 통해 사용자는 STA(단일 스레드 아파트) 스레드에서 작업을 예약할 수 있습니다. 기본적으로 STA 스레드는 메시지를 펌프하지 않으므로 차단 작업을 수행할 때 교착 상태가 발생할 수 있습니다.
교착 상태를 방지하려면 사용자 정의 동기화 컨텍스트를 구현하여 메시지를 명시적으로 펌프할 수 있습니다. 여기에는 메시지 펌핑을 포함하도록 동기화Context 클래스의 Wait 메서드를 재정의하는 작업이 포함됩니다.
메시지 펌핑 구현
Wait 메소드에서 메시지 펌핑 구현:
구현예
다음은 간단한 메시지 펌핑 루프의 구현 예입니다.
<code class="language-c#">var msg = new NativeMethods.MSG(); while (true) { nativeResult = NativeMethods.MsgWaitForMultipleObjectsEx( count, waitHandles, (uint)remainingTimeout, QS_MASK, NativeMethods.MWMO_INPUTAVAILABLE); if (IsNativeWaitSuccessful(count, nativeResult, out managedResult) || WaitHandle.WaitTimeout == managedResult) return managedResult; if (NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, NativeMethods.PM_REMOVE)) { NativeMethods.TranslateMessage(ref msg); NativeMethods.DispatchMessage(ref msg); } if (hasTimedOut()) return WaitHandle.WaitTimeout; }</code>
메시지 펌핑 기능을 갖춘 사용자 정의 동기화 컨텍스트를 구현하면 STA 스레드에서 차단 작업을 안전하게 수행하여 교착 상태를 피할 수 있습니다.
위 내용은 StaTaskScheduler를 사용하여 STA 스레드에서 차단 작업을 안전하게 수행하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!