StaTaskScheduler dan mengepam mesej
StaTaskScheduler ialah sebahagian daripada pustaka ParallelExtensionsExtras dan membenarkan pengguna menjadualkan tugasan pada urutan pangsapuri berbenang tunggal (STA). Secara lalai, benang STA tidak mengepam mesej, yang boleh menyebabkan kebuntuan apabila melakukan operasi menyekat.
Untuk mengelakkan kebuntuan, anda boleh melaksanakan konteks penyegerakan tersuai untuk mengepam mesej secara eksplisit. Ini melibatkan mengatasi kaedah Tunggu kelas SynchronizationContext untuk memasukkan pengepaman mesej.
Melaksanakan pengepaman mesej
Laksanakan pengepaman mesej dalam kaedah Tunggu:
Contoh pelaksanaan
Berikut ialah contoh pelaksanaan gelung pengepam mesej ringkas:
<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>
Dengan melaksanakan konteks penyegerakan tersuai dengan keupayaan mengepam mesej, operasi menyekat boleh dilakukan dengan selamat pada urutan STA, dengan itu mengelakkan kebuntuan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Operasi Penyekatan dengan Selamat pada Benang STA Menggunakan StaTaskScheduler?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!