BackgroundWorker thread doit être STA
J'ai un BackgroundWorker pour appeler une fonction pour faire un long processus au BackgroundWorker _DoWork, quand l'erreur se produire dans la fonction, je vous invite personnalisé messagebox:
WPFMessageBoxResult result = WPFMessageBox.Show("Activation Fail", "Error!!", WPFMessageBoxButtons.OK, WPFMessageBoxImage.Error);
L'exception ci-dessous qui se passe à WPFMessageBoxResult classe :
The calling thread must be STA, because many UI components require this.
Merci.
OriginalL'auteur Alvin | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas essayer d'interagir avec tous les composants de l'INTERFACE utilisateur à partir d'un thread d'arrière-plan.
L'une des solutions pourrait être d'attraper l'exception dans votre doWork de la méthode et de l'affecter à la backgroundworker est le résultat de la propriété et de vérifier ensuite si ce résultat est un type d'exception ou non null si vous n'utilisez pas le résultat de quelque chose d'autre. ensuite, vérifiez dans le backgroundWorker_completed événement.
puis
OriginalL'auteur John L
Généralement avec les Winforms/WPF vous utilisez Invoke() de sauter sur le thread de l'INTERFACE utilisateur si vous avez besoin d'interagir avec l'INTERFACE utilisateur à partir d'un travail de longue haleine. Vous pouvez appeler appeler à partir de n'importe quel objet qui appartient à l'INTERFACE utilisateur, mais assurez-vous, lorsque dans l'invoquer l'étendue de ne faire que peu de code que possible. Étant donné que ce code est sur le thread d'INTERFACE utilisateur il permet de bloquer/de blocage de l'INTERFACE utilisateur si il prend trop de temps.
OriginalL'auteur Despertar
Votre thread d'arrière-plan est juste un thread de travail et pas un thread d'interface utilisateur. WPF et les WinForms ils exigent que le thread d'exécution de l'interface utilisateur les actions seront marqués comme STA (Single Threaded Apartment) parce que le code de l'interface utilisateur n'est pas thread-safe. Ils exigent également que vous ajoutez un message de la pompe, de sorte que windows les messages sont envoyés.
Je recommande qu'au lieu d'afficher la boîte de message dans votre thread de vous envoyer un message à votre interface utilisateur principale de fil et le fil afficher la boîte de message. Pour ce faire, vous devez passer une référence à l'expéditeur de l'INTERFACE utilisateur principale de thread dans le thread de travail. Puis utiliser le Répartiteur.BeginInvoke à la demande d'un délégué être appelé revenir sur le thread principal.
Sinon, vous pouvez attendre que le thread d'arrière-plan, puis vérifier le résultat et montrent la réponse appropriée à l'utilisateur. De toute façon le thread de travail ne doit pas être directement en interaction avec l'interface utilisateur.
OriginalL'auteur Phil Wright
Vous devez utiliser cette méthode
OriginalL'auteur reza