如何在c#.net中的每个行的多个线程和一个线程中逐行处理文件?

时间:2015-08-11 06:04:13

标签: c# .net wpf multithreading file

我已经创建了一个c#WPF项目,我已经处理了一些csv文件,其中包含一些记录,这些记录可能不会限制在几百或几千或几百万。我需要读取记录行,然后处理记录,通常需要5到10秒,然后用新值更新记录。

该操作包括通过Web服务对服务器进行网络调用,然后服务器调用另一台服务器连接到授权服务器,授权服务器以与请求相同的循环响应数据。权限需要时间,因为它拥有一个非常大的数据库,包含大约10亿条记录。因此,加密解密和验证操作大约需要5-10秒才能完全处理。

我无法在一个线程中执行操作,因为处理整个文件可能需要几个月,因此我想创建数百个将处理数据的线程。我想到的方法是,我尝试创建一个线程,创建最多100个线程并监视它们是否有空闲线程(如果可用)。当一个线程在进程之后返回数据时,它会将其写入文件并为新行创建新线程。

我认为这种方法似乎过于复杂,我是否应该实施相同的方法以及如何或如何解决问题。

1 个答案:

答案 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>设置元素。