热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#中使用Parallel类实现多线程编程

本文介绍如何在C#中利用Parallel类实现高效的多线程处理。自.NETFramework4.0起引入的Parallel类,提供了强大的并行编程工具,包括并行的for和foreach循环,以及并行调用多个方法的功能。
### 引言
在C#中,Parallel类是.NET Framework 4.0引入的一个重要特性,旨在简化多线程编程。通过使用Parallel类,开发者可以轻松地实现并行for和foreach循环,甚至同时调用多个方法,极大地提高了程序的执行效率。

### 使用Parallel.For()方法
#### 基本使用
Parallel.For()方法的工作方式类似于传统的for循环,但它能够在多个线程上并行执行循环体。这意味着,循环中的每次迭代都可以由不同的线程独立完成,从而加速了整体的执行时间。

```csharp
ParallelLoopResult result = Parallel.For(0, 10, i => {
Console.WriteLine("{0}, task: {1}, thread: {2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine(result.IsCompleted);
Console.ReadKey();
```
上述代码展示了如何使用Parallel.For()方法并行执行一个简单的任务,输出每个迭代的索引、任务ID和线程ID。

#### 中断循环
Parallel.For()方法也支持循环的提前终止。通过向方法传递一个`Action`类型的委托,可以调用`ParallelLoopState`对象的`Break()`或`Stop()`方法来中断循环。

```csharp
ParallelLoopResult result = Parallel.For(0, 10, (int i, ParallelLoopState pls) => {
Console.WriteLine("i: {0}, task: {1}", i, Task.CurrentId);
Thread.Sleep(10);
if (i > 5) {
pls.Break();
}
});
Console.WriteLine(result.IsCompleted);
Console.WriteLine("Lowest break iteration: {0}", result.LowestBreakIteration);
Console.ReadKey();
```

#### 使用Parallel.For()方法
当需要在每个线程上执行特定的初始化或清理工作时,可以使用`Parallel.For()`方法。该方法允许指定初始化和清理委托,以及循环体委托。

```csharp
Parallel.For(0, 20,
() => {
Console.WriteLine("init thread {0}, task {1}", Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
return "t" + Thread.CurrentThread.ManagedThreadId;
},
(i, pls, str) => {
Console.WriteLine("body i {0} \t str {1} \t thread {2} \t task {3}", i, str, Thread.CurrentThread.ManagedThreadId, Task.CurrentId);
Thread.Sleep(10);
return "i \t" + i;
},
(str) => {
Console.WriteLine("finally\t {0}", str);
}
);
Console.ReadKey();
```

### 使用Parallel.ForEach()方法
#### 基本使用
Parallel.ForEach()方法适用于需要并行处理集合的情况。它能够以非确定性的顺序并行遍历集合中的元素。

```csharp
string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };
ParallelLoopResult result = Parallel.ForEach(data, (s) => {
Console.WriteLine(s);
});
Console.ReadKey();
```

#### 中断循环
类似于Parallel.For(),Parallel.ForEach()也支持通过`ParallelLoopState`对象来中断循环。

```csharp
string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };
ParallelLoopResult result = Parallel.ForEach(data, (s, pls, l) => {
Console.WriteLine("{0}\t{1}", s, l);
if (l > 10) {
pls.Break();
}
});
Console.WriteLine("Lowest break iteration: {0}", result.LowestBreakIteration);
Console.ReadKey();
```

### 使用Parallel.Invoke()方法
Parallel.Invoke()方法允许并行执行多个独立的操作。这在需要同时启动多个任务时非常有用。

```csharp
static void Main(string[] args) {
Parallel.Invoke(Foo, Bar);
Console.ReadKey();
}

static void Foo() {
Console.WriteLine("Foo");
}

static void Bar() {
Console.WriteLine("Bar");
}
```

以上介绍了如何在C#中使用Parallel类来实现高效的多线程编程。通过这些方法,可以显著提高应用程序的性能和响应速度。
推荐阅读
author-avatar
你看看我的世界_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有