C# 8.0以降では、usingステートメントの非同期版であるawait usingステートメントを用いることができます。 usingステートメントがIDisposableインターフェイスを持つオブジェクトに対して適用できるのに対し、await usingステートメントはIAsyncDisposableインターフェイスを持つオブジェクト・非同期の破棄・解放処理(DisposeAsync)をサポートしているオブジェクトに対して適用できます。

await usingステートメントは、usingステートメントと同様入れ子にすることができるほか、ローカル変数宣言形式で記述することもできます。

await usingステートメントを使ってオブジェクトを非同期的に破棄する 
using System;
using System.IO;
using System.Threading.Tasks;

class Sample {
  static async Task Main()
  {
    // "source.txt"を読み込むストリームと、"dest.txt"に書き込むストリームを作成し、
    // 使用し終わったら非同期的に破棄する
    await using (Stream fromStream = File.OpenRead("source.txt"), toStream = File.OpenWrite("dest.txt")) {
      // fromStreamの内容をtoStreamにコピーする
      // (ファイルsource.txtの内容をdest.txtにコピーする)
      await fromStream.CopyToAsync(toStream);
    }

    // await usingステートメントを入れ子にする場合は次のようになる
    await using (var fromStream = File.OpenRead("source.txt")) {
      await using (var toStream = File.OpenWrite("dest.txt")) {
        await fromStream.CopyToAsync(toStream);
      }
    }

    await CopyAsync();

    static async Task CopyAsync()
    {
      // ローカル変数宣言形式のawait usingステートメントの場合は次のようになる
      await using var fromStream = File.OpenRead("source.txt");
      await using var toStream = File.OpenWrite("dest.txt");

      await fromStream.CopyToAsync(toStream);
    }
  }
}