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