[英]Do I need to call DisposeAsync on a FileStream when using it with using clause?
考慮從Microsoft 文檔中獲取的以下代碼:
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 可能是資源密集型的,因此如果您可以調用DisposeAsync
則您不想調用Dispose
。
編寫的代碼將首先調用DisposeAsync
,然后在 scope 結束時它還將調用Dispose
。 我們可以假設它是無害的,因為實施 class 應該檢查資源是否已經被處置,所以第二個Dispose
應該什么都不做。 但是,如果您使用 C#8+,則可以使用await using
:
await using FileStream createStream = File.Create(fileName);
這與using
相同,但它會在 scope 結束時調用await DisposeAsync()
,而不是Dispose
。 所以就像你現在做的那樣,但是自動(並且在 finally 塊中)。 它適用於IAsyncDisposable
目標(例如FileStream
,它繼承自實現Stream
的IAsyncDisposable
)。
您需要在此處檢查整個代碼段:
public static async Task Main()
{
var weatherForecast = new WeatherForecast
{
// ...
};
string fileName = "WeatherForecast.json";
using FileStream createStream = File.Create(fileName);
await JsonSerializer.SerializeAsync(createStream, weatherForecast);
await createStream.DisposeAsync();
Console.WriteLine(File.ReadAllText(fileName));
}
using
聲明會在當前scope結束的finally塊中調用Dispose
,這里的問題是在scope結束之前訪問文件:
Console.WriteLine(File.ReadAllText(fileName));
所以await createStream.DisposeAsync();
實際上是需要的,否則文件將不可訪問(或者即使它可以 - 可能不會刷新所有數據)。
在這種具體情況下,切換到using
語句(帶大括號的語句, using
語句和聲明實際上都支持處理IAsyncDisposable
)會更干凈,並且會使await createStream.DisposeAsync();
調用冗余:
await using (FileStream createStream = File.Create(fileName))
{
await JsonSerializer.SerializeAsync(createStream, weatherForecast);
}
Console.WriteLine(File.ReadAllText(fileName));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.