【问题标题】:Using C# 5.0 async to read a file使用 C# 5.0 异步读取文件
【发布时间】:2013-01-26 12:57:37
【问题描述】:

我刚刚开始使用 C# 的新 async 功能。我现在已经阅读了大量关于并行下载等的操作指南,但没有阅读/处理文本文件。

我有一个用于过滤日志文件的旧脚本,我想我应该升级它。但是我不确定我对新 async/await 语法的使用是否正确。

在我的脑海中,我看到这是逐行读取文件并将其传递给不同的线程进行处理,因此它可以继续而无需等待结果。

我的想法是否正确,或者实现它的最佳方法是什么?

static async Task<string[]> FilterLogFile(string fileLocation)
{
    string line;

    List<string> matches = new List<string>();

    using(TextReader file = File.OpenText(fileLocation))
    {        
        while((line = await file.ReadLineAsync()) != null)
        {
            CheckForMatch(line, matches);
        }
    }

    return matches.ToArray();
}

完整脚本:http://share.linqpad.net/29kgbe.linq

【问题讨论】:

  • 刚刚查看了msdn docs,这清楚地表明我正在以错误的方式考虑关键字。在这种情况下,我认为他们无法提高性能。
  • 我可以推荐这个吗? blog.jerrynixon.com/2012/06/…

标签: c# asynchronous windows-8 async-await c#-5.0


【解决方案1】:

在我的脑海中,我看到这是逐行读取文件并将其传递给不同的线程进行处理,因此它可以继续而无需等待结果。

但这不是您的代码所做的。相反,您将(异步)在所有读取完成后返回一个数组。如果你真的想一个一个地异步返回匹配,你需要某种异步集合。您可以为此使用 TPL Dataflow 中的块。例如:

ISourceBlock<string> FilterLogFile(string fileLocation)
{
    var block = new BufferBlock<string>();

    Task.Run(async () =>
    {
        string line;

        using(TextReader file = File.OpenText(fileLocation))
        {        
            while((line = await file.ReadLineAsync()) != null)
            {
                var match = GetMatch(line);

                if (match != null)
                    block.Post(match);
            }
        }

        block.Complete();
    });

    return block;
}

(您可能需要添加错误处理,可能是通过错误返回的块。)

然后,您会将返回的块链接到另一个将处理结果的块。或者您可以直接从块中读取它们(使用ReceiveAsync())。


但是查看完整代码,我不确定这种方法对您是否有用。由于您处理结果的方式(分组,然后按每组中的数量排序),在您拥有所有结果之前,您无法对它们做太多事情。

【讨论】:

  • 这更有意义。感谢您提供示例 tpl 数据流代码。然后我应该在匹配列表或CheckForMatch 方法上等待吗?因为我想它与同步运行没有太大区别。
  • @Sam 你应该只在有意义的地方使用await,这主要是在使用 IO 的代码中。这里与同步代码的区别: 1. await file.ReadFileAsync() 不会阻塞线程,因此效率更高。 2.您可以在读取结果时对其进行处理,而不会阻塞另一个线程。
猜你喜欢
  • 2018-04-29
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2015-09-04
  • 2019-09-22
  • 2017-01-13
相关资源
最近更新 更多