2011-08-24 74 views
4

這是我的問題:我取消了一個點擊事件的工作正常的任務。現在我想通過點擊最初啓動任務的相同啓動事件來重新啓動任務。 我得到的「錯誤」是我得到了MessageBox信息(「Stop Clicked」)。所以我在「清理任務」中「卡住」了。WPF TPL重新啓動一個取消的任務

如何解決這個問題? 非常感謝幫助。

謝謝!

這裏是我的代碼:

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(); } 

回答

8

嘗試簡單的創建一個新的CancellationTokenSource,當你點擊開始產生新的憑證。

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

從在線圖書:

一個取消標記應該是指一個「取消作業」,然而 該操作可能會在你的程序中實現。在標記的IsCancellationRequested屬性 被設置爲true之後,其 不能重置爲false。因此,註銷令牌在取消後不能重複使用 。

+0

這樣做的伎倆。非常感謝!也感謝你的摘錄! 我還有很多要學習:( – user774326

相關問題