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 中国語 Web サイトの他の関連記事を参照してください。