C# .Net 4.5 中的线程管理

本文关键字:线程 管理 Net | 更新日期: 2023-09-27 18:34:55

我正在尝试进行一些多线程计算,但是在独立管理每个线程时遇到了一些麻烦。

例如,如果一个线程比其他线程更快地完成其计算,我如何检测它并为下一个计算启动一个新线程,而无需等待整个过程和所有其他线程完成自己的任务?

顺便说一下,我正在使用 C# .net 4.5。

谢谢

C# .Net 4.5 中的线程管理

既然你正在使用 .NET4.5,为什么不直接使用TPL - 任务并行库? 它可以完成您尝试执行的所有操作(任务调度和管理(等等。

http://msdn.microsoft.com/en-us/library/dd460717.aspx

从网站:

任务并行库 (TPL( 是 .NET Framework 4 中的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL 的目的是通过简化向应用程序添加并行性和并发性的过程来提高开发人员的工作效率。TPL 动态扩展并发程度,以最有效地使用所有可用的处理器。此外,TPL 还处理工作的分区、线程池上的线程调度、取消支持、状态管理和其他低级详细信息。通过使用 TPL,您可以最大限度地提高代码的性能,同时专注于程序旨在完成的工作。

为每个计算创建 TPL 任务,并启动它们,内部每个任务都将排队并在线程可用时执行,因此您不必为线程管理而烦恼,它将在内部处理。

如果要限制一次要执行的最大并行任务,可以使用 Parallel.Invoke 方法并设置 MaxDegreeOfParallelism例如

Parallel.Invoke(
new ParallelOptions() { MaxDegreeOfParallelism = 3 }, 
() => Calculation1(), 
() => Calculation2(),
() => Calculation3(),
);

Parallel.Invoke 采用一组参数并对其执行操作以并行运行它们,同时您可以设置 MaxDegreeOfParallelism 以设置一次要运行的最大计算数。

例如

我想你有相同的方法(计算(但多个参数(参数(作为输入。

Parallel.ForEach(Parameters,new ParallelOptions() { MaxDegreeOfParallelism = 3 }, parameter=> Calculate(parameter));