Update-Benutzeroberfläche aus verschiedenen fehlschlägt
-
03-07-2019 - |
Frage
Ich versuche, von nmap in WPF-Fenster Anwendung (Textbox genau) die Standardausgabe zu setzen. Ich versuche Dispatcher.Invoke zu verwenden, aber wenn nmap Prozess beginnt alles nur friert. Als ich versuchte, diese in einer Konsolenanwendung (w / o Invoke), alles gut gearbeitet, ich denke, es ist ein Problem mit der Invoke-Methode ist. Nmap selbst arbeitet, und Finishing es funktioniert, aber es gibt keine Antwort in meinem Fenster.
Hier ist der Code verwende ich:
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));
}
}
Lösung
Dies kann durch verschiedene Ursachen hervorgerufen werden. Erstens Stellen Sie sicher, dass nmapOutput Steuerung auf UI-Thread erstellt. Zweitens Dispatcher.Invoke kann UI-Thread Deadlock verursacht (und es ist wahrscheinlich in Ihrem Fall).
Rufen Sie immer Dispatcher.CheckAccess () vor Invoke aufrufen, oder verwenden Sie BeginInvoke diesen Vorgang in asynchroner Weise durchzuführen.