Skip to content

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