別のプロセスからのUIの更新が失敗する
-
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コントロールがUIスレッドで作成されていることを確認します。 第二に、Dispatcher.InvokeはUIスレッドのデッドロックを引き起こす可能性があります(おそらくあなたの場合です)。
Invokeを呼び出す前に必ずDispatcher.CheckAccess()を呼び出すか、BeginInvokeを使用してこの方法を非同期的に実行します。
所属していません StackOverflow