亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 信號量未按預期工作,無法找出原因

C# 信號量未按預期工作,無法找出原因

C#
aluckdog 2023-09-24 16:18:01
我正在用 C# 構建一個 ASP.NET (.NET Framework) 應用程序,我正在對名為“LinuxDocker”的后端服務進行 API 調用,并且我試圖限制 ASP.NET 應用程序對其進行的 12 個并發調用的數量。這是我寫的代碼:private static Semaphore LinuxDockerSemaphore = new Semaphore(12, 12);public static SemaphoreWaiter WaitForLinuxDocker(int timeoutMS = -1){      return new SemaphoreWaiter(LinuxDockerSemaphore, timeoutMS);}public class SemaphoreWaiter : IDisposable{    Semaphore Slim;    public SemaphoreWaiter(Semaphore slim, int timeoutMS = -1)    {        Slim = slim;        Slim.WaitOne(timeoutMS);    }    public void Dispose()    {        Slim.Release();    }}然后,當我調用后端服務時,我會這樣做:using (ConcurrencyManager.WaitForLinuxDocker()){      // Call backend service here}所以看起來這應該限制為 12 個并發調用,但是當我通過 100 個并發調用的集成測試來測試它時,它基本上一次只允許 1 個請求通過,而不是一次 12 個調用通過。該服務在 Windows Server 2016 和 .NET Framework 4.7 上的 IIS 上運行。我已經多次閱讀這段代碼,但不明白為什么它不起作用。任何幫助將不勝感激。
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

可能您的后端正在由多個w3wp.exe工作進程提供服務。因為您的信號量是在沒有名稱的情況下創建的,所以它是一個“本地”信號量(每個進程的本地),而不是“全局”信號量(系統范圍):

信號量有兩種類型:本地信號量和命名系統信號量。如果使用接受名稱的構造函數創建 Semaphore 對象,則它會與該名稱的操作系統信號量相關聯。命名系統信號量在整個操作系統中都是可見的,并且可用于同步進程的活動。您可以創建多個代表同一個命名系統信號量的 Semaphore 對象,并且可以使用 OpenExisting 方法打開現有的命名系統信號量。

本地信號量僅存在于您的進程中。它可以被進程中任何引用本地信號量對象的線程使用。每個信號量對象都是一個單獨的本地信號量。


查看完整回答
反對 回復 2023-09-24
  • 1 回答
  • 0 關注
  • 120 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號