質問

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を使用してこの方法を非同期的に実行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top