在C#并行编程中,ParallelOptions是配置并行操作行为的核心类,其中MaxDegreeOfParallelism和CancellationToken是两个非常实用的属性,分别用于控制并行并发数量和实现任务取消功能。合理运用这两个属性,能够提升并行代码的执行效率和可控性。

MaxDegreeOfParallelism的作用与用法
MaxDegreeOfParallelism用于设置并行循环或操作的最大并发任务数,默认值为-1,表示由运行时根据系统资源自动决定并发数量。当我们需要限制并行操作的资源占用时,就可以手动设置这个属性的值。
比如我们有一个需要处理大量数据的并行循环,不希望同时启动太多线程导致CPU占用过高,就可以将MaxDegreeOfParallelism设置为合适的数量:
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// 创建ParallelOptions实例并设置最大并发数为4
ParallelOptions options = new ParallelOptions
{
MaxDegreeOfParallelism = 4
};
// 并行处理1到10的数字
Parallel.For(1, 11, options, (i) =>
{
Console.WriteLine($"正在处理数字 {i},线程ID:{System.Threading.Thread.CurrentThread.ManagedThreadId}");
System.Threading.Thread.Sleep(1000); // 模拟耗时操作
});
Console.WriteLine("并行处理完成");
}
}
上述代码中,即使系统支持更多并发线程,Parallel.For循环最多只会同时运行4个任务,避免资源过度消耗。
CancellationToken的作用与用法
CancellationToken用于实现并行任务的取消逻辑,当外部触发取消请求时,正在执行的并行任务可以感知到取消信号并安全终止。使用CancellationToken需要搭配CancellationTokenSource来创建取消令牌。
下面是一个使用CancellationToken取消并行操作的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// 创建取消令牌源
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions options = new ParallelOptions
{
CancellationToken = cts.Token
};
// 启动一个线程用于触发取消请求,3秒后取消
Task.Run(() =>
{
Thread.Sleep(3000);
cts.Cancel();
Console.WriteLine("已触发取消请求");
});
try
{
Parallel.For(1, 101, options, (i) =>
{
// 检查是否收到取消请求
options.CancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"正在处理数字 {i}");
Thread.Sleep(500); // 模拟耗时操作
});
}
catch (OperationCanceledException)
{
Console.WriteLine("并行操作已被取消");
}
}
}
代码中我们通过CancellationTokenSource在3秒后触发取消请求,并行任务在执行时会检查取消信号,一旦收到信号就会抛出OperationCanceledException,终止整个并行操作。
两个属性搭配使用
在实际开发中,我们经常会同时用到MaxDegreeOfParallelism和CancellationToken,既限制并发数量,又支持任务取消。下面是搭配使用的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions options = new ParallelOptions
{
MaxDegreeOfParallelism = 3, // 最大并发3个任务
CancellationToken = cts.Token // 关联取消令牌
};
// 2秒后触发取消
Task.Run(() =>
{
Thread.Sleep(2000);
cts.Cancel();
});
try
{
Parallel.ForEach(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, options, (item) =>
{
options.CancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"处理元素 {item},线程ID:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
});
}
catch (OperationCanceledException)
{
Console.WriteLine("并行操作已取消");
}
}
}
使用注意事项
- MaxDegreeOfParallelism设置为0或负数(除了-1)会导致运行时异常,只有-1表示由系统自动分配并发数。
- 使用CancellationToken时,一定要在并行任务内部调用ThrowIfCancellationRequested方法或者检查IsCancellationRequested属性,否则即使触发了取消请求,任务也不会停止。
- 如果并行操作中涉及共享资源的修改,即使设置了MaxDegreeOfParallelism,也需要考虑线程安全问题,必要时添加同步锁。
- 取消并行操作后,已经启动的任务会尽量完成当前迭代,不会强制终止正在执行的线程,而是通过异常的方式通知调用方操作已取消。
C#ParallelOptionsMaxDegreeOfParallelismCancellationToken修改时间:2026-06-27 12:48:28