事件内Parallel ForEach循环取消

本文关键字:循环 取消 ForEach Parallel 事件 | 更新日期: 2023-09-27 18:15:19

我有一个并行foreach循环在asp.net网页上的一个事件内运行。我如何使用取消令牌取消它?这可能是一个非常长的操作-什么是困扰我的是-它似乎是张贴回来,而操作正在运行-所以我怎么能触发另一个事件使用取消令牌?这可能吗?

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

事件内Parallel ForEach循环取消

传递给你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();
}

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