Echec de la mise à jour de l'interface utilisateur à partir d'un processus différent

StackOverflow https://stackoverflow.com/questions/812813

  •  03-07-2019
  •  | 
  •  

Question

J'essaie de placer la sortie standard de nmap dans une application de fenêtre WPF (zone de texte exactement). J'essaie d'utiliser Dispatcher.Invoke, mais lorsque le processus nmap démarre, tout se bloque. Quand j'ai essayé cela dans une application console (sans Invoke), tout a bien fonctionné, je pense que c'est un problème avec la méthode Invoke. Nmap lui-même fonctionne et le finit, mais il n'y a pas de réponse dans ma fenêtre.

Voici le code que j'utilise:

 Process nmap = new Process();

 nmap.StartInfo.FileName = Properties.Settings.Default.NmapResidentialPath;
 nmap.StartInfo.Arguments = arguments.ToString();
 nmap.StartInfo.UseShellExecute = false;
 nmap.StartInfo.RedirectStandardOutput = true;
 nmap.OutputDataReceived += new DataReceivedEventHandler(nmap_OutputDataReceived);
 nmap.Start();
 nmap.BeginOutputReadLine();

 nmap.WaitForExit();
 nmap.Close();

Et la méthode du gestionnaire d'événements:

void nmap_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!String.IsNullOrEmpty(e.Data))
            {
                this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => nmapOutput.Text += "\n" + e.Data));
            }
        }
Était-ce utile?

La solution

Cela peut être causé par diverses raisons. Tout d'abord, assurez-vous que le contrôle nmapOutput est créé sur le thread d'interface utilisateur. Deuxièmement, Dispatcher.Invoke peut provoquer un blocage du thread d'interface utilisateur (ce qui est probablement le cas dans votre cas).

Appelez toujours Dispatcher.CheckAccess () avant d'appeler Invoke ou utilisez BeginInvoke pour effectuer cette opération de manière asynchrone.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top