AsyncEx - async/await の補助ライブラリ

AsyncEx - async/await の補助ライブラリ

async/await の補助ライブラリ

最終更新 2022/07/08 7:21
黑哥聊dotNet
読了目安 2 分
カテゴリ
.NET
タグ
.NET C#

紹介

async/await の補助ライブラリです。

netstandard1.3(.NET 4.6、.NET Core 1.0、Xamarin.iOS 10、Xamarin.Android 7、Mono 4.6、Universal Windows 10 を含む)をサポートしています。

インストール

NuGet パッケージ Nito.AsyncEx をインストールします

Install-Package Nito.AsyncEx -Version 5.1.2

使い方

AsyncLock

AsyncLock コンストラクタは非同期待機キューを受け取ることができます。カスタム待機キューを渡して、独自の待機ロジックを指定することも可能です。

private readonly AsyncLock _mutex = new AsyncLock();
public async Task UseLockAsync()
{
  // AsyncLock は非同期にロックできます
  using (await _mutex.LockAsync())
  {
    // ロック保持中でも await は安全です
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}

AsyncLock はキャンセルも完全にサポートしています。

public async Task UseLockAsync()
{
  // ロック取得を 2 秒だけ試みます。
  var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));

  // 2 秒経過してもロックが取得できない場合、
  // OperationCanceledException が発生します。
  using (await _mutex.LockAsync(cts.Token))
  {
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}

AsyncLock には同期 API もあります。これにより、一部のスレッドは非同期にロックを取得し、他のスレッドは同期(スレッドをブロック)してロックを取得できます。

public async Task UseLockAsync()
{
  using (await _mutex.LockAsync())
  {
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}

public void UseLock()
{
  using (_mutex.Lock())
  {
    Thread.Sleep(TimeSpan.FromSeconds(1));
  }
}

AsyncContext

AsyncContext 型は非同期操作を実行するためのコンテキストを提供します。await キーワードはコンテキストを必要とします。ほとんどのクライアントプログラムではこれは「UI コンテキスト」であり、ほとんどのサーバープログラムでは「スレッドプールコンテキスト」です。AsyncContextThreadAsyncContext を実行する独立したスレッドまたはタスクです。AsyncContextThreadThread クラスから派生していません。AsyncContext スレッドは作成されるとすぐに実行を開始します。AsyncContextThread は、別のスレッドが JoinAsync を呼び出すまでループを続けます。AsyncContextThread を破棄すると、そのスレッドに終了を要求します。

class Program
{
  static async Task<int> AsyncMain()
  {
    ..
  }

  static int Main(string[] args)
  {
    return AsyncContext.Run(AsyncMain);
  }
}

AsyncMonitor

モニター内で、タスクは WaitAsync を呼び出してシグナルを待つことができます。待機中はモニターを一時的に離れ、シグナルを受信して再びモニターに入ります。EnterAsync が返すタスクは、モニターに入った後に Completed 状態になります。待機が満たされる前にキャンセルが要求された場合、同じタスクは Canceled 状態になり、その場合モニターには入りません。

WaitAsync が返すタスクは、シグナルを受信してモニターに再入した後に Completed 状態になります。待機が満たされる前にキャンセルが要求された場合、同じタスクは Canceled 状態になり、その場合タスクはモニターに再入するまで Canceled 状態になるのを待ちます。WaitAsync が呼び出されてから返されるタスクが完了するまで、呼び出し元のタスクはモニターを離れていることに注意してください。

最後に、私の記事を気に入っていただけましたら、フォローといいねをよろしくお願いします。.NET エコシステムがますます良くなることを願っています!

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2026/04/22

各OSバージョンの.NETサポート状況(250707更新)

仮想マシンとテストマシンを使用して、各OSバージョンの.NETサポート状況を確認します。OSインストール後、対応するランタイムをインストールし、Stardustエージェントを実行できることを確認します(合格条件)。

続きを読む
同じカテゴリ / 同じタグ 2026/02/07

AOTの使用経験のまとめ

プロジェクト作成当初から、新機能を追加したり新しい構文を使用したりした場合には、すぐにAOT公開テストを実施するという良い習慣を身につけるべきです。

続きを読む