5

プロセスをで実行しているアプリケーションを作成しています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をターゲットにしています。)

4

2 に答える 2

4

協調的なキャンセルの場合 、BackgroundWorker.DoWork イベントでBackgroundWorker.CancellationPendingをリッスンする必要があります。

方法: バックグラウンド ワーカーを使用する

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var process = new Process())
    {
        //...

        process.Start()

        //...
        while(true)
        { 
            if ((sender as BackgroundWorker).CancellationPending && !process.HasExited)
            {
              process.Kill();
              break;
            }
            Thread.Sleep(100);
         }

        process.WaitForExit();
    }
}
于 2012-12-31T03:30:48.673 に答える
-1

これを試してください、これは簡単な方法であなたを助けるかもしれません

private System.Threading.TimerCallback worker;
private System.Threading.Timer workertimer ;
private void worker_DoWork()
{
   //You codes
}
private void StartWorker()
{
   worker = new System.Threading.TimerCallback(worker_DoWork);
   workertimer = new System.Threading.Timer(worker, null, 1000, 1000);
}

private void CancelWorker()
{
    worker.Dispose();
}
于 2012-12-31T01:52:30.953 に答える