2010-03-31 39 views
12

我們有一種情況,我們希望限制應用程序可以對其應用程序服務器執行併發請求的次數。我們有可能運行100多個後臺線程,它們希望在某個時候調用應用程序服務器,但只希望5個線程能夠在任何時候調用SendMessage()(或任何方法)。達到這個目標的最好方法是什麼?限制一次執行方法的線程數

我曾考慮過使用某種網守對象來阻塞進入該方法的線程,直到其中執行的線程數已經降到閾值以下。這是一個合理的解決方案,還是我忽略了這可能是骯髒/危險的事實?

我們在C#.NET 3.5中開發。

感謝,

史蒂夫

回答

10

你想要一個信號... System.Threading.Semaphore

public static class MyClass 
{ 
    private static Semaphore sem = new Semaphore(5, 5); 

    public static void SendMessage() 
    { 
     sem.WaitOne(); 

     try 
     { 
     } 
     finally 
     { 
      sem.Release(1); 
     } 
    } 
} 

另外,如果你只想要一個單獨的線程能夠在給定的時間調用一個方法,.NET也暴露出一個概念相當於Java的同步屬性:

[System.Runtime.CompilerServices.MethodImpl(MethodImpl.Synchronized)] 
+1

即使不拋出異常*,您可能也想要釋放信號量。把它放在finally塊 – 2010-03-31 10:54:09

+0

oops,我的壞,謝謝 – LorenVS 2010-03-31 10:54:39

+3

方法級同步屬性是壞的。它會鎖定「this」,例如成員,甚至更糟,靜態成員的類型。它不應該被使用。 – Josh 2010-03-31 10:55:16

1

設計模式方法: - 五個執行程序線程使用命令模式,敷在Command類的請求。