.net框架是否提供了使用文件系统的异步方法?

.net框架是否具有允许使用文件系统的async内置库/程序集(例如File.ReadAllBytesFile.WriteAllBytes )?

或者我是否必须使用StreamReaderStreamWriterasync方法编写自己的库?

像这样的东西会很不错:

 var bytes = await File.ReadAllBytes("my-file.whatever"); 

.net框架是否具有异步内置库/程序集,允许使用文件系统

是。 有异步方法可以使用文件系统,但不能用于静态File类型的辅助方法。 它们在FileStream

所以,没有File.ReadAllBytesAsync但是有FileStream.ReadAsync等。例如:

 byte[] result; using (FileStream stream = File.Open(@"C:\file.txt", FileMode.Open)) { result = new byte[stream.Length]; await stream.ReadAsync(result, 0, (int)stream.Length); } 

它已经做到了。 请参阅例如使用Async for File Access MSDN文章。

 private async Task WriteTextAsync(string filePath, string text) { byte[] encodedText = Encoding.Unicode.GetBytes(text); using (FileStream sourceStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)) { await sourceStream.WriteAsync(encodedText, 0, encodedText.Length); }; } 

.net框架是否具有允许使用文件系统的异步内置库/程序集(例如File.ReadAllBytes,File.WriteAllBytes)?

不幸的是,桌面API在异步文件操作方面有点不稳定。 正如您所指出的,许多不错的便捷方法没有异步等价物。 还缺少异步打开文件(在通过网络共享打开文件时尤其有用)。

我希望在世界迁移到.NET Core时添加这些API。

或者我是否必须使用StreamReader和StreamWriter的异步方法编写自己的库?

这是目前最好的方法。

请注意,使用ReadAsync / WriteAsync和朋友时,必须显式打开文件以进行异步访问。 执行此操作(当前)的唯一方法是使用FileStream构造函数重载,该重载采用bool isAsync参数(传递true )或FileOptions参数(传递FileOptions.Asynchronous )。 所以你不能使用像File.Open这样的方便的开放方法。

在.NET核心(从版本2.0开始),现在有相应的ReadAll / WriteAll / AppendAll方法的所有异步风格,如:

 File.(Read|Write|Append)All(Text|Lines|Bytes)Async 

https://docs.microsoft.com/en-us/dotnet/api/system.io.file.readallbytesasync?view=netcore-2.1

不幸的是,它们仍然缺少.NET标准2.0。

如果必须在后台任务中编写文件,则可以在异步方法中将其写入。

 static void Main(string[] args) { Console.WriteLine("1"); // thread 1, sync byte[] dataToWrite = System.Text.ASCIIEncoding.ASCII.GetBytes("my custom data"); Task.Run(() => { Console.WriteLine("2"); // aspetto un secondo System.Threading.Thread.Sleep(1000); // thread 2, async code System.IO.File.WriteAllBytes(@"c:\temp\prova.txt", dataToWrite); Console.WriteLine("2, end"); }); Console.WriteLine("3, exit"); Console.ReadLine(); // thread 1 } 

执行输出将是:1,3,2,2结束