簡體   English   中英

將 FileStream 與 using 子句一起使用時,是否需要在 FileStream 上調用 DisposeAsync?

[英]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 ,它繼承自實現StreamIAsyncDisposable )。

您需要在此處檢查整個代碼段:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM