簡介
async/await 的輔助庫。
支援 netstandard1.3 (包括 .NET 4.6, .NET Core 1.0, Xamarin.iOS 10, Xamarin.Android 7, Mono 4.6, and 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 狀態;在這種情況下,CancellationToken 工作不會進入監視器。
從 WaitAsync 返回的工作會在收到信號後進入 Completed 狀態,重新進入監視器。如果在等待滿足之前就發出信號,則該工作會進入 Canceled 狀態;CancellationToken 在這種情況下,工作會等待進入 Canceled 狀態,直到它重新進入監視器。請記住,從 WaitAsync 被呼叫到其返回工作完成的時間,呼叫的工作已經離開了監視器。

- GitHub 位址:https://github.com/StephenCleary/AsyncEx
最後大家如果喜歡我的文章,還麻煩給個關注並點個讚,希望 net 生態圈越來越好!