我已经创建了一个c#WPF项目,我已经处理了一些csv文件,其中包含一些记录,这些记录可能不会限制在几百或几千或几百万。我需要读取记录行,然后处理记录,通常需要5到10秒,然后用新值更新记录。
该操作包括通过Web服务对服务器进行网络调用,然后服务器调用另一台服务器连接到授权服务器,授权服务器以与请求相同的循环响应数据。权限需要时间,因为它拥有一个非常大的数据库,包含大约10亿条记录。因此,加密解密和验证操作大约需要5-10秒才能完全处理。
我无法在一个线程中执行操作,因为处理整个文件可能需要几个月,因此我想创建数百个将处理数据的线程。我想到的方法是,我尝试创建一个线程,创建最多100个线程并监视它们是否有空闲线程(如果可用)。当一个线程在进程之后返回数据时,它会将其写入文件并为新行创建新线程。
我认为这种方法似乎过于复杂,我是否应该实施相同的方法以及如何或如何解决问题。
答案 0 :(得分:2)
有两个选项可以帮助您:
并行LINQ是更简单的选项,但提供的定制更少。它看起来像是:
var results = File.ReadLines("input.csv")
.AsParallel()
.AsOrdered()
.WithDegreeOfParallelism(100)
.Select(ProcessLine);
File.WriteAllLines("output.csv", results);
(当然,您需要实施ProcessLine
方法。)
现在这会给你很多并行性,但可能是通过很多线程被大量时间阻塞......而更复杂的解决方案最终会使用异步IO,所以实际上你可能几乎不需要任何实际的线程
有一点需要注意:如果您通过网络发出 web 请求,则可能需要配置可以与主机并行执行的最大请求数。请参阅ServicePointManager.DefaultConnectionLimit
和<connectionManagement>
设置元素。