Этот код демонстрирует, что вам нужно.
Просто используйте объект SemaphoreSlim (такой же, как семафор, лучшая производительность), чтобы сделать это.
Думайте о семафоре как о счетчике. Каждый раз, когда вы ждете, счетчик выключается на одну цифру. В конце операции нужно ее отпустить.
Когда счетчик равен 0, семафор не может быть получен.
Что касается предложений ThreadPool, я не думаю, что это хорошая идея, потому что пул потоков используется во многих частях вашего приложения, не только в этом.
class Program
{
private static SemaphoreSlim threadsSemaphore = new SemaphoreSlim(5, 5);
static void Main(string[] args)
{
Timer timer = new Timer(DoSomeWork, null, 0, 100);
Console.ReadKey();
}
private static void DoSomeWork(object state)
{
if (threadsSemaphore.Wait(TimeSpan.FromSeconds(1)))
{
try
{
Console.WriteLine("Doing work ...");
Thread.Sleep(1000);
}
finally
{
threadsSemaphore.Release();
}
}
else
{
Console.WriteLine("Skipping work", threadsSemaphore.CurrentCount);
}
}
}