2009-05-01 9 views
0

nmapの標準出力をWPFウィンドウアプリケーション(テキストボックス)に入れようとしています。私はDispatcher.Invokeを使用しようとしていますが、nmapプロセスが起動するときにすべてが凍ってしまいます。私がコンソールアプリケーション(Invokeなし)でこれを試したところ、すべてうまくいっていましたが、Invokeメソッドの問題だと思います。 Nmap自体は動作しており、動作は終了していますが、私のウィンドウには応答がありません。異なるプロセスからのUIの更新が失敗しました

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)); 
      } 
     } 

答えて

2

これは、様々な理由によって引き起こされる可能性が

はここで私が使用しているコードです。 まず、UI ThreadでnmapOutputコントロールが作成されていることを確認します。 2番目に、Dispatcher.InvokeがUIスレッドのデッドロックを引き起こす可能性があります(おそらくあなたの場合です)。

Invokeを呼び出す前に常にDispatcher.CheckAccess()を呼び出すか、BeginInvokeを使用してこの操作を非同期で実行します。

+0

nmapプロセスが終了した直後にプロセスを開始するBeginInvokeウィンドウを使用しても、ウィンドウには何も出力されません。 nmapOutputは、確実にUIスレッドによって作成されます。 – anusiak

+0

バックグラウンドスレッドでnmapプロセスを起動しますか? nmap.WaitForExit()以外の場合、UIスレッドをブロックしてウィンドウをフリーズします。 –

関連する問題