1. ホーム
  2. c#

[解決済み] usingとawait usingの違いは何ですか?また、どちらを使用するかはどのように判断すればよいのでしょうか?

2022-08-02 18:11:43

質問

Visual Studio では、次のようにすることを推奨している場合があることに気づきました。

await using var disposable = new Disposable();
// Do something

この代わりに

using var disposable = new Disposable();
// Do something

の違いは何ですか? usingawait using ?

どのように決定すればよいのでしょうか?

どのように解決するのですか?

を使用したクラシック同期

Classic using は Dispose() メソッドを実装したオブジェクトの IDisposable インターフェイスを実装したオブジェクトの

using var disposable = new Disposable();
// Do Something...
    

と同じです。

IDisposable disposable = new Disposable();
try
{
    // Do Something...
}
finally
{
    disposable.Dispose();
}

を使った新しい非同期await

新しいawait usingは、呼び出しと待ち受けを DisposeAsync() メソッドを実装したオブジェクトの IAsyncDisposable インターフェイスを実装したオブジェクトの

await using var disposable = new AsyncDisposable();
// Do Something...
    

と同じです。

IAsyncDisposable disposable = new AsyncDisposable();
try
{
    // Do Something...
}
finally
{
    await disposable.DisposeAsync();
}


この IAsyncDisposable インターフェース が追加されました。 .NET Core 3.0.NET Standard 2.1 .

.NETでは、アンマネージドリソースを所有するクラスは通常 IDisposable インターフェイスを実装し、非管理下のリソースを同期的に解放するメカニズムを提供します。しかし、場合によっては 同期的なものに加えて(あるいは代わりに)、非管理下のリソースを解放するための非同期的なメカニズムを提供する。 . このようなメカニズムを提供することで、コンシューマは GUI アプリケーションのメインスレッドを長時間ブロックすることなく、リソースを大量に消費する dispose 操作を実行することができます。

このような IAsyncDisposable.DisposeAsync このインターフェースのメソッドは ValueTask を返します。これは、非同期ディスポーザブル操作を表します。アンマネージドリソースを所有するクラスはこのメソッドを実装し、これらのクラスのコンシューマは、それがもはや必要とされないとき、オブジェクト上でこのメソッドを呼び出します。