Не удается обновить пользовательский интерфейс из другого процесса - PullRequest
0 голосов
/ 01 мая 2009

Я пытаюсь поместить стандартный вывод из 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 Ответ

2 голосов
/ 01 мая 2009

Это может быть вызвано различными причинами. Во-первых, убедитесь, что элемент управления nmapOutput создан в потоке пользовательского интерфейса. Во-вторых, Dispatcher.Invoke может вызвать тупик потока пользовательского интерфейса (и это, вероятно, в вашем случае).

Всегда вызывайте Dispatcher.CheckAccess () перед вызовом Invoke или используйте BeginInvoke для выполнения этой операции асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...