【问题标题】:Async File Reading in c#c#中的异步文件读取
【发布时间】:2018-04-29 15:20:47
【问题描述】:

我有一个希望快速的问题。我正在尝试掌握异步代码,并且想知道最佳实践或最佳利用它。所以,如果你有一些代码,比如

public async void DoStuff()
{
   await Task.Factory.StartNew(() => { LoadFile(); });
   DoSomethingAfter();
}

public void LoadFile()
{
   StreamReader sr = new StreamReader("file.txt");
   String line;
   while ((line = sr.ReadLine()) != null) 
   {
      switch(line)
      {
         case "A":
           parseObjectA(line, sr); //continues with its own loop
           break;
         case "B":
           parseObjectB(line, sr); //continues with its own loop
           break;
      }
   }
}

//added for clarity
public Object parseObjectA(String line, StreamReader sr)
{
   Object obj = new Object();
   while ((line = sr.ReadLine()) != null) 
   {
      String element;
      String value;
      parseLine(line, out element, out value);
      switch(element)
      {
         case "name":
            obj.Name = value;
            break;
         case "position":
            {
               int pos = 0;
               Int32.TryParse(value, out pos);
               obj.position = pos;
               break;
            }
      }
   }
   return obj;
}

StreamReader 循环是否阻塞了我设置的任务?我注意到读取我发送给它的文件比我不使用任务时花费的时间更长。函数是否需要一直异步?比如,parseObject 中发生的事情是否也需要异步,文件读取也需要异步?谢谢。

【问题讨论】:

  • 您最好使用await sr.ReadLineAsync,而不是通过StartNew() 启动显式计算绑定Task
  • “想知道最佳实践或最佳利用方法” 我已为这些链接添加了书签,希望您能像我一样发现它们提供的信息:best practices for the busy developer, @ 987654322@和Stephen C's blog - Task.Run etiquette
  • @MickyD 如果 LoadFiles 不仅仅是读取文件怎么办?或者,当 LoadFile() 完成时,任务中是否有另一个函数被调用?是否应该一直进行异步调用以充分利用线程?
  • 我纯粹是按照你的例子来的。如果您有其他情况,请发布另一个问题或更新上述内容
  • await ReadLineAsync 不会阻止。它甚至不使用线程!

标签: c# asynchronous stream threadpool


【解决方案1】:

在 FileStream 上使用 ReadAsync 读取异步文件

public async Task<byte[]> ReadFileAsync(string path)
{
        using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.Read))
        {
            var result = new byte[fileStream.Length];
            await fileStream.ReadAsync(result, 0, (int)fileStream.Length);
            return result;
        }
}

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2019-02-20
    • 2021-08-07
    • 2019-01-13
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多