亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

如何在 await,async 中使用 lock鎖 ?
咨詢區

  • Philippe Paré

長話短說,我需要向 tcp server 發起幾個異步的 request 請求,同時我的client只能用同步阻塞UI線程的方式進行網絡請求,因為是異步發起,多個請求可能會出現并行請求 tcp server 的情況,所以我嘗試用 lock 限定 。

private readonly object readLock = new object(); 

public async Task UpdateDetAIlsAsync()
{
    //I want every request to wait their turn before requesting (using the connection) 
    //to prevent a read call from catching any data from another request
    lock (readLock)
    {
        Details details = await connection.GetDetailsAsync();
        detailsListBox.Items = details;
    }
}

但是上面的代碼會拋出下面的異常:

 error CS1996: Cannot await in the body of a lock statement

編譯器不允許在這里使用 lock ,但我只能這樣來強迫 request 請求串行,請問我該如何實現?

回答區

  • Jared Moore

要想在異步中實現串行同步,可以使用 C# 新提供的 SemaphoreSlim.WaitAsync 方法,參考如下代碼:

private readonly SemaphoreSlim readLock = new SemaphoreSlim(1, 1); 

public async Task UpdateDetailsAsync()
{
    //I want every request to wait their turn before requesting (using the connection) 
    //to prevent a read call from catching any data from another request
    await readLock.WaitAsync();
    try
    {
        Details details = await connection.GetDetailsAsync();
        detailsListBox.Items = details;
    }
    finally
    {
        readLock.Release();
    }
}

  • Contango

你所遇到的問題,其實 Nito.AsyncEx 早已經幫你解決了,它是一個 Nuget 上非常有名的異步擴展庫,很多的開發者也都是從用 AsyncLock 開始的,使用方式和同步模式的 lock 很相似,參考如下代碼:

private readonly AsyncLock _mutex = new AsyncLock();

public async Task UseLockAsync()
{
  // AsyncLock can be locked asynchronously
  using (await _mutex.LockAsync())
  {
    // It's safe to await while the lock is held
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}

更多的內容,可以參考 Github:  https://github.com/StephenCleary/AsyncEx

點評區

AsyncEx 確實是一個非常

分享到:
標簽:lock
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定