为何C# 13编译器建议对File.OpenRead()使用await using?
关于C#中
await using的疑问解答 你的代码示例:
await using (var streamReader = File.OpenRead(filePath)) using (var reader = new StreamReader(streamReader)) { while ((line = await reader.ReadLineAsync()) != null) { // my logic } }
你混淆了await的两种不同用法:
- 一种是用于等待
Task/ValueTask类型的异步方法执行完成,比如await reader.ReadLineAsync(),这里确实是因为方法返回Task才需要await。 - 另一种是
await using,它的作用和Task无关,专门用于处理实现了**IAsyncDisposable**接口的对象。
File.OpenRead()返回的FileStream在.NET 5及之后的版本里实现了IAsyncDisposable接口。当你用await using声明这个对象时,代码块结束后编译器会自动调用它的DisposeAsync()方法——这是一种异步释放资源的方式,相比同步的Dispose(),它不会阻塞调用线程,对IO类资源(比如文件流)来说,在高并发场景下能提升性能。
编译器建议替换成await using,本质是推荐你用异步方式释放文件流资源,和File.OpenRead()是否返回Task没有关系。
内容的提问来源于stack exchange,提问作者Manan Adhvaryu
相关产品推荐
相关产品推荐

