我正在尝试进行一些多线程计算,但在独立管理每个线程时遇到了一些麻烦。
例如,如果一个线程比其他线程更快地完成计算,我如何检测它并启动一个新线程进行下一次计算,而不等待整个进程和所有其他线程完成自己的任务?
顺便说一句,我正在使用 C# .net 4.5。
谢谢
我正在尝试进行一些多线程计算,但在独立管理每个线程时遇到了一些麻烦。
例如,如果一个线程比其他线程更快地完成计算,我如何检测它并启动一个新线程进行下一次计算,而不等待整个进程和所有其他线程完成自己的任务?
顺便说一句,我正在使用 C# .net 4.5。
谢谢
为每个计算创建 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));
既然您使用的是 .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,您可以最大限度地提高代码的性能,同时专注于您的程序旨在完成的工作。