如何在多线程中逐行处理文件,并在c# .net中每行使用一个线程
本文关键字:线程 一个 逐行 多线程 处理 文件 并在 net | 更新日期: 2023-09-27 18:07:12
我创建了一个c# WPF项目,我必须处理一个有一些记录的csv文件,这些记录可能不限于几百、几千或几百万。我需要读取记录行,然后处理记录,通常需要5到10秒,然后用新值更新记录。
该操作包括通过web服务对服务器进行网络调用,然后服务器调用另一个服务器连接到授权服务器,授权服务器在相同的循环中响应数据。当局需要时间,因为它有一个非常大的数据库,包含大约10亿条记录。因此,加密解密和认证操作大约需要5-10秒才能完成。
我不能在一个线程中执行操作,因为处理整个文件可能需要几个月的时间,所以我想创建数百个线程来处理数据。我正在考虑的方法是,我正在尝试创建一个线程,它可以创建多达100个线程,并在可用的情况下监视它们是否有空闲线程。当一个线程在进程结束后返回数据时,它会将数据写入文件,并为新的行创建一个新的线程来处理。
我想这个方法似乎太复杂了,我应该实现同样的,我应该如何或如何解决这个问题
这里有两个选项可以帮助您:
- 并行LINQ
- TPL Dataflow
Parallel LINQ是更简单的选择,但提供的自定义少得多。它看起来像这样:
var results = File.ReadLines("input.csv")
.AsParallel()
.AsOrdered()
.WithDegreeOfParallelism(100)
.Select(ProcessLine);
File.WriteAllLines("output.csv", results);
(当然,您需要实现ProcessLine
方法)
现在这将给你很多并行性,但可能通过很多线程被阻塞很多时间…而更复杂的解决方案是使用异步IO,因此实际上您可能几乎不需要任何实际的线程。
需要注意的一件事是:如果您通过网络发出web请求,您可能需要配置您可以与主机并行发出的最大请求数。参见ServicePointManager.DefaultConnectionLimit
和<connectionManagement>
设置元素