我有以下问题:我有一个紧密的循环(故意),它从我的 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();
}