Не удается обновить пользовательский интерфейс из другого процесса
-
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 для выполнения этой операции асинхронно.