gpt4 book ai didi

.net - 如何在 C# 2.0 中执行异步文件读取?

转载 作者:行者123 更新时间:2023-12-04 23:11:10 31 4
gpt4 key购买 nike

我有一个应用程序需要遍历文本文件中的所有行,大小超过千兆字节。其中一些文件有 10 或 100 的数百万行。

我当前(和同步)阅读的一个例子,看起来像......

  using (FileStream stream = new FileStream(args[0], FileMode.Open, FileAccess.Read, FileShare.Read)) {
using (StreamReader streamReader = new StreamReader(stream)) {
string line;
while (!string.IsNullOrEmpty(line = streamReader.ReadLine())) {
//do stuff with the line string...
}
}
}

我已经阅读了一些有关 .Net 异步 IO 流式传输方法的内容,并且我正在寻求有关此问题的 2 个具体问题的帮助。

首先,如果我需要每一行的整体性,我会通过异步读取这些文件来提高性能,这些文件通常很短,但长度不同(文件中的每一行之间没有关系)?

其次,如何将上面的代码转换为异步读取,这样我就可以像现在一样逐行处理每一行?

最佳答案

您可以尝试使文件读取异步,而不是使该行读取异步。那就是将您问题中的所有代码都包含在一个工作人员代表中。

    static void Main(string[] args)
{
WorkerDelegate worker = new WorkerDelegate(Worker);
// Used for thread and result management.
List<IAsyncResult> results = new List<IAsyncResult>();
List<WaitHandle> waitHandles = new List<WaitHandle>();

foreach (string file in Directory.GetFiles(args[0], "*.txt"))
{
// Start a new thread.
IAsyncResult res = worker.BeginInvoke(file, null, null);
// Store the IAsyncResult for that thread.
results.Add(res);
// Store the wait handle.
waitHandles.Add(res.AsyncWaitHandle);
}

// Wait for all the threads to complete.
WaitHandle.WaitAll(waitHandles.ToArray(), -1, false); // for < .Net 2.0 SP1 Compatibility

// Gather all the results.
foreach (IAsyncResult res in results)
{
try
{
worker.EndInvoke(res);
// object result = worker.EndInvoke(res); // For a worker with a result.
}
catch (Exception ex)
{
// Something happened in the thread.
}
}
}

delegate void WorkerDelegate(string fileName);
static void Worker(string fileName)
{
// Your code.
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (StreamReader streamReader = new StreamReader(stream))
{
string line;
while (!string.IsNullOrEmpty(line = streamReader.ReadLine()))
{
//do stuff with the line string...
}
}
}
}

关于.net - 如何在 C# 2.0 中执行异步文件读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/800591/

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