0

私は少し困惑しています。私は以前にバックグラウンドワーカーと協力してきましたが、アプリ内の多くの場所にバックグラウンドワーカーがいます。何が起こっているのかを「進捗状況」で表示するために、「%complete」ではなく冗長性を使用して、単純な「ウィンドウ」を作成しました。このウィンドウには、単純なラベルがあります。バックグラウンドワーカースレッドと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スレッドのウィンドウの更新を実行することはありません。だから、私は思う... DOSコマンドをBGWスレッドにラップしてみてください...だから、私は...ほとんどすべて同じです、つまり、出力ストリームをキャプチャしているDOSコマンドから、BGWスレッドはそれを取得します。次に、その文字列値をウィンドウステータスまで転送しようとしましたが、ハングしているように見えます... UIスレッドとほぼ同じように、プロセス(独自の新しいスレッド)を呼び出しているBGWスレッドを呼び出したくありません。よく遊ぶ。

何か案は?

4

1 に答える 1

1

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

私自身の質問に対する私の答えをここで参照してください:
Winformsからのcmd.exeの制御

于 2012-02-06T17:36:48.433 に答える