Comment puis-je forcer l'exécution d'une section de code sur mon thread principal?Forcer l'exécution de code sur le thread principal
Voilà pourquoi je voudrais savoir:
J'ai une boîte de message créé personnalisé qui obtient parfois montré à partir d'un fil qui est pas le fil principal. Cependant, lorsque le constructeur de la boîte de message est appelé, j'obtiens une exception InvalidOperationException disant "Le thread appelant doit être STA, car de nombreux composants de l'interface utilisateur l'exigent." Cela a du sens, les éléments de l'interface utilisateur doivent être gérés sur le thread principal.
Ma fonction MessageBox.ShowMessage (...) est une fonction statique qui crée une instance de ma boîte de message personnalisée et l'affiche. Y at-il quelque chose que je pourrais mettre dans ShowMessage qui forcerait la boîte de message à être créée et montrée sur le fil principal? Ailleurs dans mon code, j'utilise Control.BeginInvoke pour gérer des problèmes similaires, mais puisqu'il s'agit d'une fonction statique, il n'y a pas d'élément d'interface utilisateur déjà existant pour que je puisse appeler BeginInvoke.
Dois-je appeler MessageBox.ShowMessage à partir d'un Control.BeginInvoke? Je préférerais que BeginInvoke (ou un équivalent) soit appelé depuis ShowMessage.
Avez-vous un lien expliquant comment implémenter la première option? – w4g3n3r
Appelez Thread.SetApartmentState() avant de démarrer le thread. – itowlson
Lors de la création du Thread, appelez simplement .SetApartmentState comme indiqué dans la réponse (éditée). Faites-moi savoir si vous avez besoin de plus d'aide pour créer le fil en premier lieu. –