在C#中,Parallel类提供了方便的数据并行能力,但在实际开发中我们常遇到需要中途取消并行循环的场景。ParallelLoopState.Stop就是用来通知并行循环尽快停止安排新迭代的方法,它比Break更果断,适用于“只要找到结果就结束”的这类需求。

ParallelLoopState.Stop的基本用法
在Parallel.For或Parallel.ForEach的循环体里,可以通过传递的ParallelLoopState参数调用Stop。调用Stop后,运行时将不再启动新的迭代,但已经开始的迭代通常仍会执行完。
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
ParallelLoopResult result = Parallel.For(0, 100, (i, state) =>
{
if (i == 50)
{
// 找到目标,通知停止安排新迭代
state.Stop();
return;
}
Console.WriteLine("迭代: " + i);
});
Console.WriteLine("是否提前停止: " + result.IsStopped);
}
}
Stop与Break的区别
很多初学者会混淆Stop和Break,下面用表格说明两者差异:
| 方法 | 含义 | 适用场景 |
|---|---|---|
| Stop | 不再执行任何新迭代,已运行的可完成 | 只要任意一个条件满足就结束 |
| Break | 低于当前索引的迭代仍需完成,高于的不再启动 | 需要保证前面数据处理完整 |
通过ParallelLoopResult判断状态
Parallel循环会返回ParallelLoopResult对象,其中的IsStopped、IsCompleted等属性可以帮助我们确认循环结束的原因。
- IsStopped:是否有迭代调用了Stop
- IsCompleted:所有迭代是否都执行完毕
- LowestBreakIteration:若用了Break,记录最小中断点
在ForEach中使用Stop
Parallel.ForEach同样支持state.Stop,代码形式类似:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Demo
{
static void Run()
{
List<int> data = new List<int>();
for (int i = 0; i < 200; i++) data.Add(i);
Parallel.ForEach(data, (item, state) =>
{
if (item > 30)
{
state.Stop();
return;
}
Console.WriteLine(item);
});
}
}
注意事项
使用Stop时需要注意,它并不强制终止正在执行的迭代,因此循环体中的代码不应假设自己一定不会被调度。如果需要在迭代中感知是否已停止,可检查state.IsStopped属性来提前退出耗时逻辑。
合理运用ParallelLoopState.Stop,可以让并行程序在正确时机停下,既节省资源又保持逻辑清晰。
C#ParallelLoopStateStop修改时间:2026-07-28 18:39:27