StaTaskScheduler 與訊息泵送
StaTaskScheduler 是 ParallelExtensionsExtras 函式庫的一部分,允許使用者在單執行緒單元 (STA) 執行緒上調度任務。預設情況下,STA 執行緒不會泵送訊息,這在執行阻塞操作時可能導致死鎖。
為避免死鎖,可實現自訂同步上下文以明確泵送訊息。這涉及到重寫 SynchronizationContext 類別的 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中文網其他相關文章!