从不同进程更新UI失败

时间:2009-05-01 19:11:13

标签: wpf user-interface invoke

我正在尝试将nmap的标准输出放入WPF窗口应用程序(文本框中)。我正在尝试使用Dispatcher.Invoke但是当nmap进程启动时,所有内容都会冻结。当我在一个控制台应用程序(没有Invoke)中尝试这个时,一切正常,我认为这是Invoke方法的一个问题。 Nmap本身正在工作,并且完成它的工作,但我的窗口中没有响应。

这是我正在使用的代码:

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

事件处理程序方法:

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

1 个答案:

答案 0 :(得分:2)

这可能是由各种原因造成的。 首先,确保在UI Thread上创建nmapOutput控件。 其次,Dispatcher.Invoke可能导致UI线程死锁(并且可能是你的情况)。

在调用Invoke之前始终调用Dispatcher.CheckAccess(),或使用BeginInvoke以异步方式执行此操作。