限制一次执行方法的线程数

时间:2010-03-31 10:48:31

标签: c# .net multithreading asynchronous locking

我们希望限制应用程序可以对其应用程序服务器进行的并行请求的数量。我们有可能运行100多个后台线程,它们希望在某些时候调用应用程序服务器,但只希望5个线程能够在任何时候调用SendMessage()(或任何方法)。实现这一目标的最佳方式是什么?

我考虑过使用某种类型的网守对象来阻止进入该方法的线程,直到在其中执行的线程数已经降到阈值以下。这是一个合理的解决方案还是我忽略了这可能是脏/危险的事实?

我们正在使用C#.NET 3.5进行开发。

谢谢,

史蒂夫

4 个答案:

答案 0 :(得分:19)

使用信号量

http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

  

限制可以的线程数   访问资源或资源池   同时进行。

答案 1 :(得分:11)

你想要一个信号量...... 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的synchronized属性等效的概念:

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

答案 2 :(得分:1)

Semaphore课程专为这种情况而设计。

答案 3 :(得分:1)

设计模式方法: - 使用带有五个Executor线程的命令模式,并将您的请求包装在Command类中。