我們有一種情況,我們希望限制應用程序可以對其應用程序服務器執行併發請求的次數。我們有可能運行100多個後臺線程,它們希望在某個時候調用應用程序服務器,但只希望5個線程能夠在任何時候調用SendMessage()(或任何方法)。達到這個目標的最好方法是什麼?限制一次執行方法的線程數
我曾考慮過使用某種網守對象來阻塞進入該方法的線程,直到其中執行的線程數已經降到閾值以下。這是一個合理的解決方案,還是我忽略了這可能是骯髒/危險的事實?
我們在C#.NET 3.5中開發。
感謝,
史蒂夫
我們有一種情況,我們希望限制應用程序可以對其應用程序服務器執行併發請求的次數。我們有可能運行100多個後臺線程,它們希望在某個時候調用應用程序服務器,但只希望5個線程能夠在任何時候調用SendMessage()(或任何方法)。達到這個目標的最好方法是什麼?限制一次執行方法的線程數
我曾考慮過使用某種網守對象來阻塞進入該方法的線程,直到其中執行的線程數已經降到閾值以下。這是一個合理的解決方案,還是我忽略了這可能是骯髒/危險的事實?
我們在C#.NET 3.5中開發。
感謝,
史蒂夫
使用旗語
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx
限制線程的數量,可以 訪問的資源或資源 併發池。
Semaphore類是專門爲此場景設計的。
你想要一個信號... 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)]
設計模式方法: - 五個執行程序線程使用命令模式,敷在Command類的請求。
即使不拋出異常*,您可能也想要釋放信號量。把它放在finally塊 – 2010-03-31 10:54:09
oops,我的壞,謝謝 – LorenVS 2010-03-31 10:54:39
方法級同步屬性是壞的。它會鎖定「this」,例如成員,甚至更糟,靜態成員的類型。它不應該被使用。 – Josh 2010-03-31 10:55:16