2012-05-26 89 views
2

我正在使用並行foreach循環啓動多個任務。立即停止多個任務

現在我想點擊一個停止按鈕來停止所有任務。我怎樣才能做到這一點?

這裏是我的代碼:

tasks2 = new List<Task>();    

Parallel.ForEach<RssToProcess>(RssFeeds, rssFeed => 
    tasks2.Add(Task.Factory.StartNew(() => 
    { 
     string urlss = rssFeed.RssUrl; 
     nourl += urlss + System.Environment.NewLine; 

     RssReader rs = new RssReader(); 
     rs.FeedsourceLoaded += new EventHandler(rs_FeedsourceLoaded); 
     rs.ItemAdded += new EventHandler(rs_ItemAdded); 
     rs.AllItemAdded += new EventHandler(rs_AllItemAdded); 
     rs.RssReaderrssitemsCountgeta += new EventHandler(rs_RssReaderrssitemsCountgeta); 
     rs.RdfMode = true; 

     RssFeed f = rs.Retrieve(rssFeed.RssUrl); 
    }))); 
+2

。一個簡單的foreach循環是不夠的? –

回答

3

或許你也應該傳遞的CancellationToken: http://msdn.microsoft.com/en-us/library/dd537607.aspx

創建的CancellationToken:

var tokenSource = new CancellationTokenSource(); 
var token = tokenSource.Token; 

,並傳遞給你的任務:

Task.Factory.StartNew(() => 
     { 
      ... Do Work ... 
     }, token); 

如果要取消,請撥打

tokenSource.Cancel(); 

但是請注意,任務取消是合作。 在你的任務,你將需要你爲什麼要使用線程(Parallel.ForEach)創建另一個線程(Task.Factory.StartNew)使用

token.ThrowIfCancellationRequested(); // To Abort immediately. 

... OR ... 

if (token.IsCancellationRequested) 
{ 
    // Exit your task manually. 
} 
+0

似乎不需要if檢查,至少給出方法'ThrowIfCancellationRequested'的名稱? –

+0

如果您需要在ForEach完成之前支持取消操作,則可以通過設置ParallelOptions實例的屬性來傳遞取消令牌。 –

+0

@詹姆斯曼寧:你說得對。我會糾正它。 –