StaTaskScheduler et pompage de messages sur les fils de discussion STA : un examen plus approfondi
Le StaTaskScheduler, un composant de Parallel Extensions Extras, est destiné à la planification des tâches sur les threads MTA et STA. Bien que sa documentation implique que le blocage des opérations TPL sur les threads STA utilise un mécanisme de pompage de messages pour éviter les blocages, ce n'est pas toujours le cas.
Plus précisément, lorsque vous travaillez avec des objets STA COM hérités, les opérations de blocage au sein de BlockingCollection<Task>
ne parviennent souvent pas à déclencher le pompage de messages. Cette omission peut entraîner des blocages lors de l'exécution sur un thread STA.
Une solution plus robuste consiste à utiliser un contexte de synchronisation personnalisé :
Créer un contexte de synchronisation personnalisé :
SynchronizationContext.Wait
pour gérer explicitement le pompage des messages.MsgWaitForMultipleObjectsEx
avec le drapeau MWMO_INPUTAVAILABLE
. Cela permet la récupération des messages après un signal sans bloquer indéfiniment.SynchronizationContext.Wait
implémentation.L'exemple ThreadAffinityTaskScheduler
montre une solution qui résout ce problème de blocage tout en préservant l'affinité des threads pour les objets STA COM sur plusieurs await
continuations. Sa mise en œuvre garantit un WM_TEST
pompage correct des messages, évitant ainsi les blocages dans la file d'attente des messages.
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!