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


21

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

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

これの代わりに

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

違いは何であるusingとはawait using

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


3
あなただけ使用することができますように見えますawait usingIAsyncDisposable、あなたが唯一使用できるusingIDisposable他のどちらも継承しているので。どちらかを使用できるのは、具象クラスが両方を実装していて、非同期コードを作成しているかどうかによって異なります。
juharr

回答:


31

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

クラシックを使用してDispose()IDisposableインターフェイスを実装するオブジェクトのメソッドを呼び出します。

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

に相当

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

新しい非同期は使用を待ちます

新しい関数は、呼び出しの使用を待機し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アプリケーションのメインスレッドを長時間ブロックすることなく、リソースを大量に消費する破棄操作を実行できます。

このインターフェイスのIAsyncDisposable.DisposeAsyncメソッドは、非同期の破棄操作を表すValueTaskを返します。アンマネージリソースを所有するクラスはこのメソッドを実装し、これらのクラスのコンシューマーは、不要になったオブジェクトに対してこのメ​​ソッドを呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.