gpt4 book ai didi

c# - 如何在多个线程中逐行处理文件,并在 C# .net 中为每一行处理一个线程?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:02 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

并行 LINQ 是更简单的选项,但提供的定制要少得多。它看起来像:

var results = File.ReadLines("input.csv")
.AsParallel()
.AsOrdered()
.WithDegreeOfParallelism(100)
.Select(ProcessLine);

File.WriteAllLines("output.csv", results);

(当然,您需要实现 ProcessLine 方法。)

现在这会给你很多并行性,但可能是通过很多线程阻塞了很多时间......而更复杂的解决方案最终会使用异步 IO,所以实际上你可能几乎不需要任何实际的线程

需要注意的一件事:如果您通过网络发出 web 请求,您可能需要配置您可以向主机并行发出的最大请求数。参见 ServicePointManager.DefaultConnectionLimit <connectionManagement> 设置元素。

关于c# - 如何在多个线程中逐行处理文件,并在 C# .net 中为每一行处理一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31934317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com