StaTaskScheduler und Message Pumping
StaTaskScheduler ist Teil der ParallelExtensionsExtras-Bibliothek und ermöglicht Benutzern das Planen von Aufgaben in Single-Threaded-Apartment-Threads (STA). Standardmäßig pumpen STA-Threads keine Nachrichten, was bei der Ausführung von Blockierungsvorgängen zu Deadlocks führen kann.
Um Deadlocks zu vermeiden, können Sie einen benutzerdefinierten Synchronisierungskontext implementieren, um Nachrichten explizit zu pumpen. Dies beinhaltet das Überschreiben der Wait-Methode der SynchronizationContext-Klasse, um das Nachrichtenpumpen einzuschließen.
Message Pumping implementieren
Implementieren Sie das Nachrichtenpumpen in der Wait-Methode:
Beispielimplementierung
Hier ist eine Beispielimplementierung einer einfachen Message-Pump-Schleife:
<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>
Durch die Implementierung eines benutzerdefinierten Synchronisierungskontexts mit Nachrichtenpumpfunktionen können Blockierungsvorgänge sicher auf dem STA-Thread ausgeführt werden, wodurch Deadlocks vermieden werden.
Das obige ist der detaillierte Inhalt vonWie kann ich Blockierungsvorgänge für STA-Threads mit StaTaskScheduler sicher durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!