web-dev-qa-db-ja.com

使用と使用待機の違いは何ですか?そして、どの方法を使用するかをどのように決定できますか?

場合によっては、Visual Studioでこれを行うことをお勧めします

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

これの代わりに

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

usingawait usingの違いは何ですか?

どれを使用するかをどのように決定すればよいですか?

19
Justin Lessard

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

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 を返します。アンマネージリソースを所有するクラスはこのメソッドを実装し、これらのクラスのコンシューマーは、不要になったオブジェクトに対してこのメ​​ソッドを呼び出します。

27
Justin Lessard