.net框架是否提供了使用文件系统的异步方法?
.net框架是否具有允许使用文件系统的async
内置库/程序集(例如File.ReadAllBytes
, File.WriteAllBytes
)?
或者我是否必须使用StreamReader
和StreamWriter
的async
方法编写自己的库?
像这样的东西会很不错:
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结束