다른 프로세스에서 UI를 업데이트하면 실패합니다
-
03-07-2019 - |
문제
NMAP에서 WPF 창 응용 프로그램에 표준 출력을 넣으려고합니다 (정확히 텍스트 상자). Dispatcher.invoke를 사용하려고하지만 NMAP 프로세스가 시작될 때 모든 것이 정지됩니다. 콘솔 애플리케이션에서 이것을 시도했을 때 (w/o 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));
}
}
해결책
이것은 여러 가지 이유로 인해 발생할 수 있습니다. 먼저 UI 스레드에서 nmapoutput 컨트롤이 생성되는지 확인하십시오. 둘째, Dispatcher.invoke는 UI 스레드 교착 상태를 유발할 수 있습니다 (아마도 귀하의 경우에있을 것입니다).
호출을 호출하기 전에 항상 Dispatcher.checkaccess ()를 호출하거나 BeginInvoke를 사용 하여이 작업을 비동기 방식으로 수행하십시오.
제휴하지 않습니다 StackOverflow