我有一段代码,看起来像这样:
Parallel.Foreach(ItemSource(),(item)=>DoSomething(item));
ItemSource()
产生一个无限的项目流。
我希望循环在满足某些条件后退出,并且我宁愿不在 DoSomething 中抛出异常(我认为这种方法是一种糟糕的编程风格)。
理想情况下,会有像 cancellationToken 这样的东西。我将在一个或多个线程中调用 cancellationToken.Activate(),之后 Parallel.ForEach 将停止创建新线程,并在最后一个线程退出后返回函数。
在 C# 中使用 Parallel.ForEach 是否可以实现这一点,还是应该使用线程代替?
更新 这是 microsoft 建议 我这样做的:
try
{
Parallel.ForEach(nums, po, (num) =>
{
double d = Math.Sqrt(num);
Console.WriteLine("{0} on {1}", d, Thread.CurrentThread.ManagedThreadId);
po.CancellationToken.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException e)
{
Console.WriteLine(e.Message);
}
我不喜欢这种方法,因为它涉及在委托内部抛出异常。
CancellationToken.IsCancellationRequested
属性,然后以任意你想要的方式从方法中返回。 - Trevor Elliott