Звучит так, будто вам нужен межмашинный семафор, вы можете реализовать его с помощью решения распределенного кэширования, такого как memcached.В качестве альтернативы вы могли бы запустить другую службу WCF на одной машине, которая управляет семафором для ваших служб с балансировкой нагрузки.
Таким образом, новая служба может выглядеть примерно так:
[ServiceContract]
public interface ISemaphorService
{
[OperationContract]
void Acquire();
[OperationContract]
void Release();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SemaphoreService
{
private readonly static Semaphore Pool = new Semaphore(5, 5);
public void Acquire()
{
Pool.WaitOne();
}
public void Release()
{
Pool.Release();
}
}
В реальноммировое приложение, вы можете захотеть иметь количество семафоров, настраиваемых в конфигурации или чем-то подобном, и включать некоторые таймауты и механизм включения, чтобы гарантировать своевременное освобождение семафоров и / или при сбое клиента:
// on the client side (service C)
var client = new SemaphoreServiceClient();
try
{
// acquire the semaphore before processing the request
client.Acquire();
// process request
...
}
finally
{
// always remember the release the semaphore
client.Release();
}