我有一个集成服务,它运行一个计算量大、数据绑定(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/