- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经创建了一个 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/
我是一名优秀的程序员,十分优秀!