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?
不,遗憾的是Win32 API中缺少这个.设备驱动程序确实具有"异步打开"的概念,因此基础设施就在那里; 但Win32 API不公开此功能.
当然,这意味着.NET也无法公开该功能.但是,您可以使用"假异步"操作 - 即,将文件读取包装在a中Task.Run
,以便不阻止UI线程.但是,如果您使用的是ASP.NET,则不要使用Task.Run
; 只是让(阻塞)文件保持打开状态.