2015-09-29 39 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

那么它绝对不会取消您的并行循环的发送部分,因为该代码不知道或了解您的取消令牌。如果你需要立即停止而不是优雅取消的能力,那么你应该考虑编写自己的线程,以便杀死整个线程。或者至少使用一个不同的库,它可以在自己的线程中运行你的代码,就像私有线程池。