让用户选择他希望程序使用多少个线程

我想创建一个程序,读取.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.SetMinThreadsThreadPool.SetMaxThreads设置可用于启动新任务的ThreadPool.SetMaxThreads

但这仍然不能说明整个故事。 可执行的并发操作数受CPU核心数的限制。 它还取决于这些操作的作用。 例如,无论您运行了多少个线程,它们都无法同时写入磁盘。 增加线程数超过某个点可能会降低性能。

因此,虽然实验很有趣,但在大多数情况下,程序的用户不太可能知道应该并发运行多少个线程。

这只是实现multithreading的一种方法。 Parellel.ForEach是一个方便的当你有一个IEnumerable (就像从文件中读取的行数组)并希望并行执行它们。

需要考虑的另一个因素是,当您并行执行操作时,您无法保证它们将执行的顺序。 它们可能看似运行FIFO,但是你会再次运行它们而不会。

Parallel.ForEach将在其自己的线程中运行每个循环实例,并且还允许您将MaxDegreeOfParallelism(线程数)设置为您想要的任何内容。

  Parallel.ForEach(lines, new ParallelOptions{ MaxDegreeOfParallelism = 10 }, line => { // do stuff with line });