C# 8.0以降では、usingステートメントの非同期版であるawait usingステートメントを用いることができます。 usingステートメントがIDisposableインターフェイスを持つオブジェクトに対して適用できるのに対し、await usingステートメントはIAsyncDisposableインターフェイスを持つオブジェクト・非同期の破棄・解放処理(DisposeAsync)をサポートしているオブジェクトに対して適用できます。
await usingステートメントは、usingステートメントと同様入れ子にすることができるほか、ローカル変数宣言形式で記述することもできます。
await usingステートメントを使ってオブジェクトを非同期的に破棄する C# 8.0
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);
}
}
}