让用户选择他希望程序使用多少个线程
我想创建一个程序,读取.txt文件的每一行对每一行做一些事情。
我想用户能够选择线程,所以如果他选择例如10个线程,那么程序将能够同时在10行上做一些事情。
假设文本文件包含例如1 000 000行,我该怎么办?
这就是我实际上逐一阅读这些内容的方法:
var lines = File.ReadLines(accounts); foreach (var line in lines) { // Start a thread, but maximum 10 threads at the same if the user input is 10, for example. }
非常感谢。
您无法绝对控制线程数。 使用的数量取决于可用数量和其他因素。 但您可以通过指定要使用的最大数量来限制线程数。
使用Parallel.ForEach
:
var options = new ParallelOptions {MaxDegreeOfParallelism = 5}; Parallel.ForEach(lines, options, line => { // do something with each line });
MaxDegreeOfParellelism
并没有讲述整个故事。 它只是限制了线程的数量。 使用的线程来自托管线程池。 可以使用ThreadPool.SetMinThreads
和ThreadPool.SetMaxThreads
设置可用于启动新任务的ThreadPool.SetMaxThreads
。
但这仍然不能说明整个故事。 可执行的并发操作数受CPU核心数的限制。 它还取决于这些操作的作用。 例如,无论您运行了多少个线程,它们都无法同时写入磁盘。 增加线程数超过某个点可能会降低性能。
因此,虽然实验很有趣,但在大多数情况下,程序的用户不太可能知道应该并发运行多少个线程。
这只是实现multithreading的一种方法。 Parellel.ForEach
是一个方便的当你有一个IEnumerable
(就像从文件中读取的行数组)并希望并行执行它们。
需要考虑的另一个因素是,当您并行执行操作时,您无法保证它们将执行的顺序。 它们可能看似运行FIFO,但是你会再次运行它们而不会。
Parallel.ForEach将在其自己的线程中运行每个循环实例,并且还允许您将MaxDegreeOfParallelism(线程数)设置为您想要的任何内容。
Parallel.ForEach(lines, new ParallelOptions{ MaxDegreeOfParallelism = 10 }, line => { // do stuff with line });