我想让一个程序读取 .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.
}
多谢。
您无法绝对控制线程数。使用的数量取决于可用数量和其他因素。但是您可以通过指定要使用的最大数量来限制线程数量。
Using :
var options = new ParallelOptions {MaxDegreeOfParallelism = 5};
Parallel.ForEach(lines, options, line =>
{
// do something with each line
});
MaxDegreeOfParellelism
不过,这并没有讲述全部故事。它仅限制线程数量。使用的线程来自托管线程池。可以使用以下命令设置可用于启动新任务的线程数ThreadPool.SetMinThreads
and ThreadPool.SetMaxThreads
.
但这还没有说明全部情况。可以执行的并发操作数量受到 CPU 核心数量的限制。它还取决于这些操作的作用。例如,无论您运行多少个线程,它们都无法同时写入磁盘。将线程数增加到超过某个点可能会降低性能。
因此,虽然实验很有趣,但在大多数情况下,程序的用户不太可能知道应该同时运行多少个线程。
而这只是实现多线程的一种方式。Parellel.ForEach
当您有一个IEnumerable
(就像从文件中读取的行数组)并希望并行执行它们。
另一个需要考虑的因素是,当您并行执行操作时,您无法保证它们的执行顺序。他们可能看起来运行 FIFO,但当你再次运行它时,他们就不会了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)