私は少し困惑しています。私は以前にバックグラウンドワーカーと協力してきましたが、アプリ内の多くの場所にバックグラウンドワーカーがいます。何が起こっているのかを「進捗状況」で表示するために、「%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スレッドを呼び出したくありません。よく遊ぶ。
何か案は?