L'interfaccia utente di aggiornamento da un processo diverso non riesce
-
03-07-2019 - |
Domanda
Sto cercando di inserire l'output standard da nmap nell'applicazione finestra WPF (casella di testo esattamente). Sto cercando di utilizzare Dispatcher.Invoke ma quando il processo nmap inizia tutto si blocca. Quando l'ho provato in un'applicazione console (senza Invoke), tutto ha funzionato bene, penso che sia un problema con il metodo Invoke. Nmap stesso funziona e sta finendo di funzionare, ma non c'è risposta nella mia finestra.
Ecco il codice che sto usando:
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();
E il metodo del gestore eventi:
void nmap_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => nmapOutput.Text += "\n" + e.Data));
}
}
Soluzione
Ciò può essere causato da vari motivi. Innanzitutto, assicurarsi che il controllo nmapOutput sia creato sul thread dell'interfaccia utente. In secondo luogo, Dispatcher.Invoke può causare deadlock del thread dell'interfaccia utente (e probabilmente è nel tuo caso).
Chiama sempre Dispatcher.CheckAccess () prima di chiamare Invoke o usa BeginInvoke per eseguire questa operazione in modo asincrono.