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));
            }
        }
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top