事件中的并行ForEach循环取消

时间:2015-09-29 14:31:01

标签: c# asp.net

我在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  
    });
}

2 个答案:

答案 0 :(得分:1)

传递给你Parallel.ForEach CancellationToken并检查你的循环内部是否请求取消。如果它被请求它将抛出异常并退出循环。调用

cts.Cancel();
从循环外部的

将CancellationToken设置为Cancel状态,它将在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();
}

答案 1 :(得分:0)

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