【发布时间】:2019-09-19 08:17:10
【问题描述】:
这是How to: Cancel a Parallel.For or ForEach Loop的文档
我已经编写了一个使用该功能的方法:
static async Task SpreadCheer(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
var friends = await GetFriends();
Parallel.ForEach(friends,
new ParallelOptions
{ CancellationToken = cancellationToken},
friend=>
{
SendCake(friend);
// (*1)
});
}
在文档中的示例中,在每个循环的最后一行,(*1)。它添加了一个cancellationToken.ThrowIfCancellationRequested。
这让我很困惑,因为那我为什么将它传递给并行选项。如果令牌被取消,我也可以see thatParallel.Foreach 在处理项目后已经抛出。如果令牌从一开始就取消,它也会在开始任何循环之前立即抛出。这也是我运行和测试此代码的经验,不需要显式抛出取消。
我是否需要(我什至应该)将cancellationToken.ThrowIfCancellationRequested 放置在(*1) 的位置?
当然文档有一个例子,但它没有明确提到它,如果有一个单元测试涵盖了这个,它不需要通过该测试的代码。据我所知。
额外的上下文:
关于取消的一些上下文。取消的原因是我有一个 Azure WebJob 到 SpreadCheer,Spreading Cheer 可能需要一段时间,如果 Azure 向我发送关闭信号,我想优雅地停止传播欢呼。我不想弄乱任何人的蛋糕。
【问题讨论】:
-
与此同时,我决定不在位置 (*1) 放置任何东西,因为我无法编写基于添加该代码的从红色变为绿色的测试。
标签: c# parallel.foreach