我正在使用任何时候都有100个会话限制的WSDL API。我使用C#,所以这意味着在我的应用程序中我只能存在100个WSSession类实例,否则API会拒绝调用。
我能接近这个的最佳方式是什么?我在一个很容易达到100个会话限制的大型应用程序中工作。我不想在达到会话限制时抛出错误,而是在会话可用之前阻止我。
答案 0 :(得分:2)
您可以通过单个服务路由所有远程呼叫,在此服务中,您可以计算呼叫发生时正在进行的操作数量。
您可以使用Semaphore来控制给定块的并发性。
假设您为外部Web服务创建了代理服务,您可以创建这样的服务来处理所有调用。 我还假设您正在使用控制反转,因此您需要确保只是此服务的单个实例处理所有调用。
还有其他选择;
服务:
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(...));