Pregunta

Estoy tratando de poner una salida estándar de nmap en la aplicación de la ventana WPF (cuadro de texto exactamente). Estoy intentando usar Dispatcher.Invoke pero cuando el proceso de nmap comienza, todo se congela. Cuando intenté esto en una aplicación de consola (sin Invoke), todo funcionó bien, creo que es un problema con el método Invoke. Nmap en sí está funcionando, y terminarlo funciona, pero no hay respuesta en mi ventana.

Aquí está el código que estoy 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();

Y el método del controlador de eventos:

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

Solución

Esto puede ser causado por varias razones. Primero, asegúrese de que el control nmapOutput se haya creado en el subproceso de la interfaz de usuario. En segundo lugar, Dispatcher.Invoke puede causar un interbloqueo en el hilo de la interfaz de usuario (y probablemente esté en su caso).

Siempre llame a Dispatcher.CheckAccess () antes de llamar a Invoke, o use BeginInvoke para realizar esta operación de manera asíncrona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top