c# - 如何将方法限制为 n 个并发调用

标签 c# multithreading .net-4.0 concurrency

我有一个集成服务,它运行一个计算量大、数据绑定(bind)的过程。我想确保同时运行的这些进程绝不会超过 n = 5(但 n 将在运行时可配置、可更改)。这个想法是将服务器上的负载限制在安全水平。该方法处理的数据量受批处理限制,因此我无需担心 1 个进程代表比另一个进程大得多的负载。

处理方法由另一个进程调用,其中运行工资单的请求保存在队列中,我可以在该点插入一些逻辑来确定是现在处理该请求,还是将其留在队列中。

所以我想在与处理方法相同的服务上有一个单独的方法,它可以告诉我服务器是否可以接受对处理方法的另一个调用。它会问,“有多少工资核算正在进行?是否少于 n?”实现这一目标的巧妙方法是什么?

------------编辑------------

我想我需要说清楚,决定是否将请求从队列中取出的过程通过 WCF 边界与处理工资单数据的服务分开。停止工资单处理过程中的线程不会阻止更多请求的进入

最佳答案

您可以使用 Semaphore 来执行此操作。

public class Foo
{
    private Semaphore semaphore;
    public Foo(int numConcurrentCalls)
    {
        semaphore = new Semaphore(numConcurrentCalls, numConcurrentCalls);
    }

    public bool isReady()
    {
        return semaphore.WaitOne(0);
    }

    public void Bar()
    {
        try
        {
            semaphore.WaitOne();//it will only get past this line if there are less than 
            //"numConcurrentCalls" threads in this method currently.
            //do stuff
        }
        finally
        {
            semaphore.Release();
        }
    }
}

关于c# - 如何将方法限制为 n 个并发调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13880423/

相关文章:

c - 多线程 - C 中矩阵乘法中偶尔出现的段错误

java - java中多线程环境中的静态方法行为

c# - WPF:删除标题/控制框

c# - 如何禁用方法中的参数评估

.net - 内存利用率 : WPF vs Windows Forms

c# - 从图像 src 获取 base64 字符串

c# - 使用 "using"时的意外行为

java - 如何将字符串的值从线程传输到另一个线程?

c# - 我可以动态添加文件到部署项目吗?

c# - 权限处理的模式/设计建议