1

可能重复:
限制一次执行方法的线程数

在单个应用程序中,我们需要将一段代码的执行限制为 4 个线程。这部分不是线程的开始/结束,它是线程内部的一段代码。

如何做到这一点很容易 - 创建一个 EventWaitHandle 并在其上等待/发出信号。但是我想到做 4 的每一种方式都留下了确定我需要等待的可能性,另一个线程存在该部分和信号,然后我等待 - 永远。

那么当所有线程都在一个应用程序中时,最轻量级的方法是什么?

背景:我们正在更改我们的许可模型,以允许最多 N(本示例中为 4 个)线程连续调用我们的库。因为我们是一个库,而不是服务器,所以我们不控制线程的使用(就像数据库一样)。对于 Web 应用程序,调用应用程序也不控制线程数,因此我们需要暂停线程 5 调用我们,直到前 4 个线程退出该代码。

4

2 回答 2

3

Semaphore是非常适合您的线程原语。它将允许最多指定数量的并发用户;额外的用户将阻止。

private static Semaphore _semaphore = new Semaphore(4, 4);

然后对于您要共享的代码:

_semaphore.WaitOne();
try
{
    // protected code goes here
}
finally
{
    _semaphore.Release();
}

就开销而言,这样做的好处是高效:它正确地WaitOne阻塞了您的线程,并且当有人调用 a 时您可以有效地解除阻塞。Release

于 2012-11-04T00:34:14.143 回答
0

正如romkyns所提到的,我会使用 Semaphore 。然而,信号量下的操作应该是相当大的——开销很大。考虑SemaphoreSlim是否适合您的情况(即,如果许可仅适用于单个进程,请参阅如何在 Semaphore 和 SemaphoreSlim 之间进行选择?MSDN)。

题外话:

This seems like a very inconvinient licensing scheme. What do you want to achieve doing this? The licensing scheme should reflect buisness value and talking about number of concurrent threads seems hard to communicate to management. Secondly, how will this licensing scheme help you communicate the need for more licenses? It seems hard to monitor the usage if you base the licenses on the number of threads, making it hard to justify the need for more licenses to your users.

于 2012-11-04T00:39:50.413 回答