紹介
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 コンテキスト」であり、ほとんどのサーバープログラムでは「スレッドプールコンテキスト」です。AsyncContextThread は AsyncContext を実行する独立したスレッドまたはタスクです。AsyncContextThread は Thread クラスから派生していません。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 が呼び出されてから返されるタスクが完了するまで、呼び出し元のタスクはモニターを離れていることに注意してください。

- GitHub アドレス:https://github.com/StephenCleary/AsyncEx
最後に、私の記事を気に入っていただけましたら、フォローといいねをよろしくお願いします。.NET エコシステムがますます良くなることを願っています!