Maison >développement back-end >C++ >Comment puis-je effectuer en toute sécurité des opérations de blocage sur les threads STA à l'aide de StaTaskScheduler ?
StaTaskScheduler et pompage de messages
StaTaskScheduler fait partie de la bibliothèque ParallelExtensionsExtras et permet aux utilisateurs de planifier des tâches sur des threads cloisonnés à thread unique (STA). Par défaut, les threads STA ne pompent pas les messages, ce qui peut provoquer des blocages lors de l'exécution d'opérations de blocage.
Pour éviter les blocages, vous pouvez implémenter un contexte de synchronisation personnalisé pour pomper explicitement les messages. Cela implique de remplacer la méthode Wait de la classe SynchronizationContext pour inclure le pompage de messages.
Mise en œuvre du pompage de messages
Implémenter le pompage de messages dans la méthode Wait :
Exemple de mise en œuvre
Voici un exemple d'implémentation d'une simple boucle de pompage de messages :
<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>
En implémentant un contexte de synchronisation personnalisé avec des capacités de pompage de messages, les opérations de blocage peuvent être effectuées en toute sécurité sur le thread STA, évitant ainsi les blocages.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!