私はBackgroundWorker
で実行中のプロセスを持つアプリケーションを作成しています。私はユーザーインターフェイスからのキャンセルをサポートしたいと思いますが、これを簡単に行う方法はありません。System.Diagnostics.Process.Start()経由でプロセスをキャンセルする
Process
は、実際にはかなり長い実行コマンドラインのexeです。出力はProgress.OutputDataReceived
イベントを介して非同期的にリダイレクトされ、GUIに進行状況を報告するために使用されています。
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
using (var process = new Process())
{
//...
process.Start()
//...
process.WaitForExit();
}
}
private void CancelWorker()
{
worker.CancelAsync();
// where to actually listen for the cancellation???
}
はStandardInput
別にメインスレッドからの入力のために、「聞く」プロセスを持つ方法があるようには表示されませんが、それは動作しませんしない限り、アプリ自体の意志特定に応じ入力を中止します。
メインスレッドからのキャンセル要求に基づいてプロセスをキャンセルする方法はありますか?私のプロセスで実行中のEXEのの目的のために
、私はただの副作用せずに終了しProcess.Close()
を呼び出すことができますが、Process
オブジェクトだけworker_DoWork()
方法にはよく知られているので、私はトラックを保持する必要がありますProcess
インスタンスの中止の目的のために...それは私がよりよい方法があるかもしれないことを望んでいる理由です。
(それが重要ならば、私は互換性の問題のための.NET 3.5をターゲットにしています。)
あなたはBGワーカープロセスを開始している理由はありますか?これは一般的に長い時間がかからない呼び出しです(起動するプログラムには時間がかかるかもしれませんが、それはそれ自身のプロセスになります)。 – keyboardP
これは実際にはバックグラウンドワーカーではありませんが、カスタムAsyncメソッドでは、 'BackgroundWorker'は状況を説明するのが簡単です。しかし、これはバックグラウンドスレッドで実行されている大きなプロセスの一部です。 – psubsee2003
あなたのDoWorkメソッド内に多少の負荷がかかっていない限り、スレッドが数ミリ秒以内にジョブを終了したため、CancelAsyncは機能しません。 'using'は良い習慣ですが、コード内の他の場所から' Process'にアクセスできる必要があるので、 'Process'を保持するクラスレベルの変数を持ち、' Process.Close'を呼び出すことができます。あなたのスレッドが返ってくるか、プロセスがもはや必要でなくなったときに、プロセスに対して 'Dispose'を呼び出すことを覚えておいてください。 – keyboardP