C# 多线程 07-使用 PLINQ 01-使用 Parallel 类
🏷️ 《C# 多线程》
示例代码
csharp
static void Main(string[] args)
{
// 调用 Invoke 方法并行的运行多个任务
Parallel.Invoke(
() => EmulateProcessing("Task1"),
() => EmulateProcessing("Task2"),
() => EmulateProcessing("Task3")
);
// 使用 ForEach 方法并行的循环任务
var cts = new CancellationTokenSource();
var result = Parallel.ForEach(
Enumerable.Range(1, 30),
new ParallelOptions
{
// 可以指定 CancellationToken 取消循环
CancellationToken = cts.Token,
// 限制最大并行度
MaxDegreeOfParallelism = Environment.ProcessorCount,
// 设置自定义的 TaskScheduler 类
TaskScheduler = TaskScheduler.Default
},
// Action 可以接受一个附加的 ParallelLoopState 参数
(i, state) =>
{
Console.WriteLine(i);
if (i == 20)
{
// 调用 Break 方法停止循环
// Bread 方法停止之后的迭代,但之前的迭代还要继续工作
state.Break();
// 也可以使用 Stop 方法停止循环
// Stop 方法会告诉循环停止任何工作,并设置并行循环状态属性 IsStopped 值为 true
// state.Stop();
Console.WriteLine($"Loop is stopped: {state.IsStopped}");
}
});
Console.WriteLine("---");
// 循环是否已完成
Console.WriteLine($"IsCompleted: {result.IsCompleted}");
// 最低迭代索引
Console.WriteLine($"Lowest break iteration: {result.LowestBreakIteration}");
Console.ReadLine();
}
static string EmulateProcessing(string taskName)
{
Thread.Sleep(TimeSpan.FromMilliseconds(new Random(DateTime.Now.Millisecond).Next(250, 350)));
Console.WriteLine($"{taskName} task was processed on a thrad id {Thread.CurrentThread.ManagedThreadId}");
return taskName;
}
输出结果
txt
Task3 task was processed on a thrad id 4
Task2 task was processed on a thrad id 3
Task1 task was processed on a thrad id 1
1
4
6
5
8
9
10
11
12
13
14
15
16
17
18
19
20
3
23
7
24
2
26
Loop is stopped: False
21
---
IsCompleted: False
Lowest break iteration: 19