我想创建一个程序来读取每行.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.
}
非常感谢。
答案 0 :(得分:3)
您无法绝对控制线程数。使用的数量取决于可用数量和其他因素。但您可以通过指定要使用的最大数量来限制线程数。
var options = new ParallelOptions {MaxDegreeOfParallelism = 5};
Parallel.ForEach(lines, options, line =>
{
// do something with each line
});
但是,{p> MaxDegreeOfParellelism
并不能说明整个故事。它只是限制了线程的数量。使用的线程来自托管线程池。可以使用ThreadPool.SetMinThreads
和ThreadPool.SetMaxThreads
设置可用于启动新任务的线程数。
但这仍然不能说明整个故事。可执行的并发操作数受CPU核心数的限制。它还取决于这些操作的作用。例如,无论您运行了多少线程,它们都无法同时写入磁盘。增加线程数超过某个点可能会降低性能。
因此,虽然尝试它很有趣,但在大多数情况下,程序用户不太可能知道应该同时运行多少个线程。
这只是实现多线程的一种方法。当Parellel.ForEach
(就像从文件中读取的行数组一样)并希望并行执行它们时,IEnumerable
会很方便。
要考虑的另一个因素是,当您并行执行操作时,您无法保证它们将执行的顺序。它们似乎可以运行FIFO,但是您将再次运行它并且它们不会。
答案 1 :(得分:2)
Parallel.ForEach将在自己的线程中运行每个循环实例,并且还允许您将MaxDegreeOfParallelism(线程数)设置为您想要的任何内容。
Parallel.ForEach(lines, new ParallelOptions{ MaxDegreeOfParallelism = 10 }, line =>
{
// do stuff with line
});