2009-05-01 2 views
0

Ich versuche Standardausgabe von nmap in WPF-Fenster-Anwendung (Textfeld genau). Ich versuche, Dispatcher.Invoke zu verwenden, aber wenn nmap Prozess startet, friert alles nur ein. Als ich dies in einer Konsolenanwendung (ohne Invoke) probiert habe, hat alles gut geklappt, ich denke, es ist ein Problem mit der Invoke-Methode. Nmap selbst funktioniert, und es funktioniert, aber es gibt keine Antwort in meinem Fenster.Update UI von verschiedenen Prozess fehlschlägt

Hier ist der Code, den ich mit:

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(); 

Und die Event-Handler-Methode:

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

Antwort

2

Dies wird durch verschiedene Ursachen hervorgerufen werden kann. Stellen Sie zuerst sicher, dass das nmapOutput-Steuerelement im UI-Thread erstellt wird. Zweitens, Dispatcher.Invoke kann UI Thread-Deadlock (und es ist wahrscheinlich in Ihrem Fall).

Rufen Sie Dispatcher.CheckAccess() vor dem Aufrufen von Invoke ab, oder verwenden Sie BeginInvoke, um diesen Vorgang asynchron auszuführen.

+0

Mit BeginInvoke Fenster, das den Prozess beginnt, verschwindet direkt nach dem nmap-Prozess, und ich habe immer noch keine Ausgabe in meinem Fenster. nmapOutput wird von UI-Thread sicher erstellt. – anusiak

+0

Starten Sie nmap Prozess im Hintergrund Thread? Wenn nicht, wird nmap.WaitForExit() den UI-Thread blockieren und das Fenster einfrieren. –