プロセスをで実行しているアプリケーションを作成していますBackgroundWorker
。ユーザーインターフェイスからのキャンセルをサポートしたいのですが、これを行う簡単な方法がわかりません。
これ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()
副作用なしにexitを呼び出すことができますが、Process
オブジェクトはメソッドにのみ認識されているため、キャンセルのためにインスタンスをworker_DoWork()
追跡する必要があります。 Process
..だからこそ、もっと良い方法があるのではないかと期待しています。
(重要な場合は、互換性の問題で.NET 3.5をターゲットにしています。)