c# - 将 FileStream 与 using 子句一起使用时,是否需要在 FileStream 上调用 DisposeAsync?

标签 c# .net filestream using

考虑以下摘自 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() 方法不是多余的吗?

最佳答案

using 子句将调用 Dispose() 方法,而不是 DisposeAsync()。这是不一样的,因为 Dispose() 正在阻止调用并且 DisposeAsync 的存在表明 dispose 可能是资源密集型的,所以你不想调用 Dispose 如果您可以改为调用 DisposeAsync

编写的代码将首先调用 DisposeAsync,然后在作用域的末尾还会调用 Dispose。我们可以假设它是无害的,因为实现类应该检查资源是否已经被释放,所以第二个 Dispose 应该什么都不做。但是,如果您使用 C#8+,则可以使用 await using:

await using FileStream createStream = File.Create(fileName);

这与 using 相同,但它会在范围末尾调用 await DisposeAsync(),而不是 Dispose。所以就像你现在做的那样,但是自动(并且在 finally block 中)。它适用于 IAsyncDisposable 目标(例如 FileStream 继承自 Stream,它实现了 IAsyncDisposable)。

关于c# - 将 FileStream 与 using 子句一起使用时,是否需要在 FileStream 上调用 DisposeAsync?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75095154/

相关文章:

c# - SSL 自签名证书

c# - 如何使用 Bootstrap 在同一行中对齐文本框和标签

c# - 我正在尝试使用 linq 简化一个语句,该语句采用 2 个数字列表并从第二个数字中减去第一个数字

c# - 如何清除另一个进程正在使用的文本文件

c# - 选择所有节点

c# - EntityFramework.Extend 与 LinqPad 一起使用吗?

c# - 如何根据某些条件从现有集合创建新列表

.net - 每天点击一个网址一次

c# - 如何在不转到磁盘的情况下将字符串加载到 FileStream 中?

c# - 读取文件流读取器