簡単なウィンドウでプロセスと表示からの出力ストリームをキャプチャ

私は少し困惑しています。以前はバックグラウンドワーカーと仕事をしていて、アプリの多くの場所にいました。何が起こっているのかを「進捗状況」を表示するために、単に「%完了」ではなく言葉で表現するために、私は単純な「ウィンドウ」を作成しました。このウィンドウには、シンプルなラベルがあります。バックグラウンドワーカースレッドとUIスレッドの問題のため、私は直接アクセスすることができませんので、私はウィンドウ上に "セッター"を持っています。

public string NewStatus
{
   set { this.lblWindowShowStatus.Content = value; }
}

したがって、BGW "ReportsProgress"によって、ウィンドウの "NewStatus"セッターに何らかのメッセージを渡します(したがって、適切なUIスレッドで動作しています)。これは完全に動作し、問題はありません...バックグラウンドワーカーがC#.Netアプリ内で何かをやっていることが条件です。

次へ...いくつかのコマンド引数でDOSコマンドを実行する必要がありますが、醜い黒いウィンドウを見たくありません。だから、他のスレッドから、私はそれを見つけ出し、その部分を完璧に処理しました。問題はありません。したがって、この時点で、2つの要素(バックグラウンドワーカーが状態をリフレッシュするウィンドウ)と(DOSコマンドを呼び出してパラメータ化されたユーティリティを実行する)間のすべての構文と機能性。

今、問題です。 DOSコマンドの実行中にウィンドウの状態が更新されるようにしようとしています。だから、これは "OutputDataReceived"に出力とキャプチャラインを一度にリダイレクトする(これは完璧です)。

oDOSCall.StartInfo.RedirectStandardOutput = true;
oDOSCall.OutputDataReceived += DOSOutputHandler;

// start for process and wait asynchronously until finished...
oDOSCall.Start();

// NOW begin async read of output stream
oDOSCall.BeginOutputReadLine();

oDOSCall.WaitForExit();

その後、DOSOutputHandlerで、私は

private void DOSOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
  //Collect the sort command output.
   if (!String.IsNullOrEmpty(outLine.Data))
   {
      string txtData = outLine.Data;

     //pass on to the WINDOW directly
      oWnd.NewSubStatus = txtData;
   }
}

これはちょうどハングし、UIスレッドのウィンドウへの更新を実行しません。ですから、私は... BGWスレッドにDOSコマンドをラップしようとします...だから、私は...ほぼ同じです、だから、出力ストリームをキャプチャしているDOSコマンドから、BGWスレッドはそれを取得します。その文字列の値をWindowステータスに転送しようとしますが、ハングアップしているようです... UIスレッドのように、プロセス(新しいスレッド自体)を呼び出すBGWスレッドを呼び出すのは嫌ですよく遊ぶ。

何か案は?

0

1 答え

ストリームを使用する代わりに、出力イベントを使用してみてください!

See my answer here to my own question:
Controling cmd.exe from Winforms

1
追加された
あなたが持っていたものは、私が持っているものに非常に近いです...私はWinFormsではなくWPFを使用していますが、私は "Invoke"オプション(まだ)を見ていません。 ...たぶん私は単純なものを見逃しているだけかもしれません。
追加された 著者 DRapp,
Invokeは、別のスレッドからメソッドを呼び出すときに使用されます。これは、イベントハンドラが別のスレッドで実行されるため必要です。私はWPFには呼び出しのようなものがあると思います。そうでなければ、WPFでマルチスレッドアプリケーションを書くことはできません。
追加された 著者 Stefan Steiger,
WPFでは代わりにディスパッチャが使用されます。 TextBox.Invokeの代わりにTextBox.Dispatcher.Invokeを使用します。 social.msdn.microsoftを参照してください。 .com/forums/ja-US/wpf/thread /…
追加された 著者 Stefan Steiger,