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

时间:2017-11-09 00:45:49

标签: c# multithreading

我想创建一个程序来读取每行.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.
}

非常感谢。

2 个答案:

答案 0 :(得分:3)

您无法绝对控制线程数。使用的数量取决于可用数量和其他因素。但您可以通过指定要使用的最大数量来限制线程数。

使用Parallel.ForEach

var options = new ParallelOptions {MaxDegreeOfParallelism = 5};
Parallel.ForEach(lines, options, line =>
{
    // do something with each line
});
但是,{p> MaxDegreeOfParellelism并不能说明整个故事。它只是限制了线程的数量。使用的线程来自托管线程池。可以使用ThreadPool.SetMinThreadsThreadPool.SetMaxThreads设置可用于启动新任务的线程数。

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

因此,虽然尝试它很有趣,但在大多数情况下,程序用户不太可能知道应该同时运行多少个线程。

这只是实现多线程的一种方法。当Parellel.ForEach(就像从文件中读取的行数组一样)并希望并行执行它们时,IEnumerable会很方便。

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

答案 1 :(得分:2)

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

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