場合によっては、Visual Studioでこれを行うことをお勧めします
await using var disposable = new Disposable();
// Do something
これの代わりに
using var disposable = new Disposable();
// Do something
using
とawait using
の違いは何ですか?
どれを使用するかをどのように決定すればよいですか?
Classic usingは、IDisposable
インターフェースを実装するオブジェクトのDispose()
メソッドを呼び出します。
_using var disposable = new Disposable();
// Do Something...
_
に相当
_IDisposable disposable = new Disposable();
try
{
// Do Something...
}
finally
{
disposable.Dispose();
}
_
新しい関数は、呼び出しの使用を待機し、IAsyncDisposable
インターフェースを実装するオブジェクトのDisposeAsync()
メソッドを待機します。
_await using var disposable = new AsyncDisposable();
// Do Something...
_
に相当
_IAsyncDisposable disposable = new AsyncDisposable();
try
{
// Do Something...
}
finally
{
await disposable.DisposeAsync();
}
_
IAsyncDisposable Interface が_.NET Core 3.0
_および_.NET Standard 2.1
_に追加されました。
.NETでは、アンマネージリソースを所有するクラスは通常 IDisposable インターフェイスを実装して、アンマネージリソースを同期的に解放するメカニズムを提供します。ただし、場合によっては同期リソースに加えて(またはその代わりに)アンマネージリソースを解放するための非同期メカニズムを提供するが必要です。このようなメカニズムを提供することで、コンシューマは、GUIアプリケーションのメインスレッドを長時間ブロックすることなく、リソースを大量に消費する破棄操作を実行できます。
このインターフェイスの IAsyncDisposable.DisposeAsync メソッドは、非同期の破棄操作を表す ValueTask を返します。アンマネージリソースを所有するクラスはこのメソッドを実装し、これらのクラスのコンシューマーは、不要になったオブジェクトに対してこのメソッドを呼び出します。