Не удается обновить пользовательский интерфейс из другого процесса

StackOverflow https://stackoverflow.com/questions/812813

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь поместить стандартный вывод из 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));
            }
        }
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top