考虑以下取自Microsoft docs的代码:
using FileStream createStream = File.Create(fileName);
// ...write to stream etc..
await createStream.DisposeAsync(); // <- isn't this done automatically because of the using clause in the first line`?
调用DisposeAsync()
方法不是多余的吗?
2条答案
按热度按时间lkaoscv71#
using
子句将调用Dispose()
方法,而不是DisposeAsync()
。这是不一样的,因为Dispose()
正在阻塞调用,并且DisposeAsync
的存在表明dispose可能占用大量资源,因此如果可以调用DisposeAsync
,则不希望调用Dispose
。编写的代码将首先调用
DisposeAsync
,然后在作用域的末尾调用Dispose
。我们可以假设这是无害的,因为实现类应该检查资源是否已经被释放,因此第二个Dispose
不应执行任何操作。但是,如果您使用C#8+,则可以使用await using
:这与
using
相同,但它将在作用域的末尾调用await DisposeAsync()
,而不是Dispose
。因此,就像您现在所做的一样,但自动(并在finally块中)。它使用IAsyncDisposable
目标(例如FileStream
,它继承自Stream
,后者实现IAsyncDisposable
)。i7uaboj42#
你需要检查整个片段在这里:
using
声明将在当前作用域的末尾调用generated finally块中的Dispose
,这里的问题是文件在作用域结束之前被访问:因此,实际上需要
await createStream.DisposeAsync();
,否则文件将无法访问(或者即使可以访问,也可能不会刷新所有数据)。在这个具体的例子中,切换到
using
statement(带大括号的using
statement,而且using
语句和声明实际上都支持处理IAsyncDisposable
)会更简洁,并且会使await createStream.DisposeAsync();
调用变得冗余: