这是我的问题:我使用Click事件取消了一个可以正常工作的任务。现在,我想通过单击最初启动任务的同一启动事件来重新启动任务。 我得到的“错误”是我收到MessageBox信息(“Stop Clicked”)。所以我“陷入”清理任务中。
我该如何解决这个问题? 非常感谢帮助。
谢谢!
这是我的代码:
public partial class MainWindow
{ CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
}
private void Start_Click(object sender, RoutedEventArgs e)
{ 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
{ token.ThrowIfCancellationRequested();
Parallel.For(0, dicQueryNoQueryURL.Count, po
, i =>
{ token.ThrowIfCancellationRequested();
if (!token.IsCancellationRequested){// do work
}
});
}
while (!token.IsCancellationRequested);
}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
dlTask.ContinueWith(
(antecedents) =>
{ if (token.IsCancellationRequested){
MessageBox.Show("Stop Clicked");
}
else
{ MessageBox.Show("Signalling production end"); }
dlTask.Dispose();
}, uiScheduler);
}
private void btnStop_Click(object sender, RoutedEventArgs e){ cts.Cancel(); }
答案 0 :(得分:8)
单击“开始”时,尝试创建新的CancellationTokenSource并生成新的令牌。
private void Start_Click(object sender, RoutedEventArgs e)
{
cts = new CancellationTokenSource();
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken token = cts.Token;
...
从网上书籍:
一个取消令牌应该引用一个“可取消操作” 但是,该操作可能在您的程序中实现。之后 令牌的IsCancellationRequested属性已设置为true,它 无法重置为false。因此,取消令牌不可能 取消后重复使用。