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