0

次の問題があります。WPFアプリケーションのMainWindow.csのクリックイベントで開始する(意図的に)タイトなループがあります。

これで、別のボタンによってトリガーされた停止イベントにより、タイトループが停止し、タスクが終了するはずです。

私のタイトなループにはループがありますParallel.For。アイデアは、一定量のことを同時に実行する必要があり(Parallel.For)、これを何度も繰り返す必要があるということです(タイトなループ)。これが最善のアプローチかどうかはわかりませんが、私が持っていたのはこれだけですが、機能します:)。

何もしないように見えるCancellation.Tokenに問題があります。ループを停止してタスクを正しく終了するにはどうすればよいですか。

これが私のコードです:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken token = cts.Token;

ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

Task dlTask = Task.Factory.StartNew( 
() =>
{
  do
  {
    Parallel.For(0, num, po, i => {
      if (!token.IsCancellationRequested)
      {
        // do work
      }
    });
  }
  while (!token.IsCancellationRequested);

}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

dlTask.ContinueWith(prev => 
{
     //clean up
}, uiScheduler);

po.CancellationToken.IsCancellationRequested私はそれを使って、または使わずに試しましたが、止まりませんでした。

private void btnStop_Click(object sender, RoutedEventArgs e)
{
  if (cts.IsCancellationRequested || po.CancellationToken.IsCancellationRequested)
  {
    cts.Cancel();
  }
}

更新:Damien_The_Unbelieverのおかげで解決策

private void btnStop_Click(object sender, RoutedEventArgs e)
{
  cts.Cancel();
}
4

1 に答える 1

2

停止ボタンのイベント ハンドラーでcts.Cancel()を呼び出す必要があります。これにより、キャンセルをリクエストしたことがキャンセル トークンに通知されます。

于 2011-08-24T14:26:24.523 に答える