2015-09-29 66 views
0

我有一個並行的foreach循環在asp.net網頁上的事件中運行。 如何使用取消令牌取消它?這可能是一個非常長的操作 - 而且令我困擾的是 - 它似乎在操作正在運行時發回 - 所以如何觸發另一個事件來使用取消令牌?這可能嗎?並行ForEach循環取消事件

protected void btnSend_Click(object sender, EventArgs e) 
{ 
    mailList = tbEmailTo.Text.Split(
     new string[] { "," }, 
     StringSplitOptions.RemoveEmptyEntries).ToList(); 
    Parallel.ForEach(emailList, email => 
    { 
     //just sending email 
    }); 
} 
+0

這個怎麼樣? http://stackoverflow.com/a/4676238/993547 –

+0

我沒有看到在該代碼中被解僱的任何事件? – JohnCoderMan

+0

「Split」後面並不需要'ToList'。 Parallel.ForEach'和數組一樣工作。 – juharr

回答

1

傳遞給你Parallel.ForEach CancellationToken並檢查循環內部是否請求取消。如果它被請求,它會拋出異常並退出你的循環。從你的循環之外調用

cts.Cancel(); 

將設置的CancellationToken以取消狀態,它會扔你Parallel.ForEach循環內的異常。

CancellationTokenSource cts = new CancellationTokenSource(); 
ParallelOptions po = new ParallelOptions(); 
po.CancellationToken = cts.Token; 

try 
{ 
    Parallel.ForEach(emailList, po, (email) => 
    { 
     //just sending email here 

     po.CancellationToken.ThrowIfCancellationRequested(); 
    }); 
} 
catch (OperationCanceledException e) 
{ 
} 
finally 
{ 
    cts.Dispose(); 
} 
+0

以下是我不明白的 - 如何在回發期間觸發事件以告知取消事件? – JohnCoderMan

+0

這不是一個窗體應用程序 – JohnCoderMan

+0

@JohnAshton,請看看這篇文章http://forums.asp.net/t/1786513.aspx?Cancel+Thread+process+CancellationToken+not+working他們使用ASP .NET從Webforms取消長時間運行的任務 –

0

那麼它絕對不會取消您的並行循環的發送部分,因爲該代碼不知道或瞭解您的取消令牌。如果你需要立即停止而不是優雅取消的能力,那麼你應該考慮編寫自己的線程,以便殺死整個線程。或者至少使用一個不同的庫,它可以在自己的線程中運行你的代碼,就像私有線程池。