AsyncEx - async/await 的輔助庫

AsyncEx - async/await 的輔助庫

async/await 的輔助庫

最後更新 2022/7/8 上午7:21
黑哥聊dotNet
預計閱讀 3 分鐘
分類
.NET
標籤
.NET C#

簡介

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 是一個單獨的執行緒或工作,它執行 AsyncContextAsyncContextThread 不是從 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 被呼叫到其返回工作完成的時間,呼叫的工作已經離開了監視器。

最後大家如果喜歡我的文章,還麻煩給個關注並點個讚,希望 net 生態圈越來越好!

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2026/2/7

AOT使用經驗總結

從專案建立伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 AOT 發布測試。

繼續閱讀