如何在多线程中逐行处理文件,并在c# .net中每行使用一个线程

本文关键字:线程 一个 逐行 多线程 处理 文件 并在 net | 更新日期: 2023-09-27 18:07:12

我创建了一个c# WPF项目,我必须处理一个有一些记录的csv文件,这些记录可能不限于几百、几千或几百万。我需要读取记录行,然后处理记录,通常需要5到10秒,然后用新值更新记录。

该操作包括通过web服务对服务器进行网络调用,然后服务器调用另一个服务器连接到授权服务器,授权服务器在相同的循环中响应数据。当局需要时间,因为它有一个非常大的数据库,包含大约10亿条记录。因此,加密解密和认证操作大约需要5-10秒才能完成。

我不能在一个线程中执行操作,因为处理整个文件可能需要几个月的时间,所以我想创建数百个线程来处理数据。我正在考虑的方法是,我正在尝试创建一个线程,它可以创建多达100个线程,并在可用的情况下监视它们是否有空闲线程。当一个线程在进程结束后返回数据时,它会将数据写入文件,并为新的行创建一个新的线程来处理。

我想这个方法似乎太复杂了,我应该实现同样的,我应该如何或如何解决这个问题

如何在多线程中逐行处理文件,并在c# .net中每行使用一个线程

这里有两个选项可以帮助您:

    并行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>设置元素