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

Ste*_*eld 15 .net c# multithreading asynchronous locking

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

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

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

谢谢,

史蒂夫

Muh*_*han 19

使用信号量

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

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


Lor*_*nVS 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只希望单个线程能够在给定时间调用方法,则.NET还会公开与java的synchronized属性等效的概念:

[System.Runtime.CompilerServices.MethodImpl(MethodImpl.Synchronized)]
Run Code Online (Sandbox Code Playgroud)

  • 方法级同步属性不好.它为例如成员锁定"this",更糟糕的是,静态成员的类型.永远不应该使用它. (4认同)