WPF TPL Перезапустить отмененную задачу - PullRequest
4 голосов
/ 24 августа 2011

Вот моя проблема: я отменяю задачу с событием 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 Ответ

8 голосов
/ 24 августа 2011

Попробуйте просто создать новый CancellationTokenSource и сгенерировать новый токен при нажатии кнопки «Пуск».

private void Start_Click(object sender, RoutedEventArgs e)
{
    cts = new CancellationTokenSource();           
    var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    CancellationToken token = cts.Token;
...

Из книг онлайн:

Один токен отмены должен относиться к одной «отменяемой операции» однако эта операция может быть реализована в вашей программе. После IsCancellationRequested свойство токена было установлено в true, оно не может быть сброшено в ложь. Следовательно, токены отмены не могут быть повторно использованы после того, как они были отменены.

...