OpenRead是异步的

roi*_*oim 5 c# file-io async-await

我正在使用以下C#代码通过网络共享读取一个小文本文件:

string fileContent;
using (var stream = File.OpenRead(filePath))
using (var reader = new StreamReader(stream, FileEncoding))
{
    fileContent = await reader.ReadToEndAsync();
}
Run Code Online (Sandbox Code Playgroud)

即使文本文件非常小(小于10 KB),此操作有时需要约7秒才能运行.当发生这种情况时,我注意到大部分时间花在了上面

File.OpenRead(filePath)
Run Code Online (Sandbox Code Playgroud)

这可能是由于Windows必须解析文件共享并通过网络获取文件上的锁定.由于该方法调用不是异步的,因此阻止我当前的线程几秒钟.

是否有一种安全的方法可以异步读取磁盘中的文件,同时异步执行OpenRead?

Ste*_*ary 8

不,遗憾的是Win32 API中缺少这个.设备驱动程序确实具有"异步打开"的概念,因此基础设施就在那里; 但Win32 API不公开此功能.

当然,这意味着.NET也无法公开该功能.但是,您可以使用"假异步"操作 - 即,将文件读取包装在a中Task.Run,以便不阻止UI线程.但是,如果您使用的是ASP.NET,则不要使用Task.Run; 只是让(阻塞)文件保持打开状态.

  • @roim:ASP.NET上`async`的主要目标是释放线程池线程,以便服务器可以扩展; 使用`Task.Run`,将强制进行上下文切换,然后使用一个线程池线程来释放另一个线程池线程.净亏损.我已经在[MSDN文章](https://msdn.microsoft.com/en-us/magazine/dn802603.aspx)和[在我的博客上](http://blog.stephencleary)上写了一些文章. COM /十一分之二千零一十三/ taskrun礼仪-例子-不要-use.html). (4认同)
  • 碉堡了。是否有声音可以将其添加到 Win 10 API 中? (2认同)