Вы можете перенаправить все свои удаленные вызовы через единую службу, в которой хранится счетчик количества операций, выполняемых в момент вызова.
Вы можете использовать Semaphore для управления параллелизмом на заданном блоке.
Предполагая, что у вас есть служба прокси, созданная для внешнего веб-сервиса, вы можете создать такую услугу, чтобы обрабатывать все вызовы. Я также предполагаю, что вы используете инверсию управления, поэтому вы должны быть уверены, что - это всего лишь один экземпляр этой службы обработки все звонки.
Существуют альтернативы этому;
- переместив семафор, и делая, что синглтон
- или давая семафорное имя.
Услуги:
public class PooledService
{
private readonly Semaphore _semaphore;
private readonly WebService _service;
public PooledService(WebService service, int max)
{
_semaphore = new Semaphore(max, max);
_service = service;
}
public R Execute<R>(Func<WebService, R> expression)
{
//will block if concurrency is at maximum, waiting up to 5 seconds
//if you want to wait forever, then just call _semaphore.WaitOne();
if (!_semaphore.WaitOne(5000))
throw new Exception("Timed Out");
try
{
return expression(_service);
}
finally
{
_semaphore.Release();
}
}
public void Execute(Action<WebService> expression)
{
//will block if concurrency is at maximum, waiting up to 5 seconds
//if you want to wait forever, then just call _semaphore.WaitOne();
if (!_semaphore.WaitOne(5000))
throw new Exception("Timed Out");
try
{
expression(_service);
}
finally
{
_semaphore.Release();
}
}
}
вы можете использовать его таким образом;
var service = new PooledService(new WebService(), 100); //maximum of 100 concurrent calls
var response = service.Execute(s => s.SomeRemoteCall(...));
Какая структура веб-сервиса вы используете? WCF? – user1431072
Извинения, я имел в виду WSDL –