OpenRead是异步的

时间:2015-04-02 01:32:54

标签: 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();
}

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

File.OpenRead(filePath)

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

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

1 个答案:

答案 0 :(得分:8)

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

当然,这意味着.NET也无法公开该功能。但是,您可以使用“伪异步”操作 - 即将您的文件包装在Task.Run内,以便不阻止您的UI线程。但是,如果您使用的是ASP.NET,请不要使用Task.Run;只需保持(阻止)文件保持打开状态。