13

プロセスを中止したいのですが、それができません。処理機能でバックグラウンド ワーカーを使用しています。

public void Init()
{
    bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    if (bw.CancellationPending == true)
    {
        e.Cancel = true;
    }
    else
    {
        e.Result = abd();
    }
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Cancelled)
    {
        lbltext.content="Canceled";
    }

    else
    {
        lbltext.content="Completed";
    }
}

private void btncan_Click(object sender, RoutedEventArgs e)
{
    bw.CancelAsync();
}

private void btnstart_Click(object sender, RoutedEventArgs e)
{
    bw.RunWorkerAsync();
}

このコードを使用してプロセスを中止することはできません。関数abd()は処理部分を実行し、結果を返します。

解決策を教えてください。

ありがとう。

4

3 に答える 3

17

呼び出すときは、フラグをbw.CancelAsync()に設定するだけです。デフォルトでは何かをキャンセルしません。保留中のキャンセルを手動で処理する必要があります。ただし、ボタンをクリックすると、3 つの可能なオプションがあるため、コードでそれを行うことはできません。CancellationPendingtrue

  • 長時間実行abd()メソッドが作業を終了し、キャンセルするものは何もありません
  • abd()作業を開始し、バックグラウンド ワーカーがブロックされました - の結果を待ってからabd()、実行を継続します - つまり、if-elseブロックを終了してRunWorkerCompletedイベントを発生させます。
  • if-elseほぼ不可能なオプション - あなたは光のように速くなり、ブロックに入る前にボタンをクリックします. よりCancellationPendingも真になり、abd()実行を開始しません

キャンセルを使用する場合は、長時間実行されるタスクをループで実行し、各ステップでキャンセルが保留中かどうかを確認します。

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    List<Foo> results = new List<Foo>();

    // any loop here - foreach, while
    for(int i = 0; i < steps_count; i++)
    {    
         // check status on each step
         if (bw.CancellationPending == true) 
         {
             e.Cancel = true;
             return; // abort work, if it's cancelled
         }

         results.Add(abd()); // add part of results
    }

    e.Result = results; // return all results
}
于 2013-08-19T13:25:14.217 に答える
0

以下はいかがでしょうか?

While(!bw.CancellationPending)
{
   //do some work!
}
e.Cancel = true;
于 2013-08-19T13:42:42.543 に答える