次の問題があります。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();
}