WPF TPL重新启动已取消的任务

时间:2011-08-24 15:53:32

标签: c# wpf multithreading task-parallel-library

这是我的问题:我使用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(); }

1 个答案:

答案 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。因此,取消令牌不可能   取消后重复使用。