.net core 当您解除对信号量LIM的引用时,它会发生什么变化?

.net core 当您解除对信号量LIM的引用时,它会发生什么变化?,.net-core,httpclient,semaphore,.net Core,Httpclient,Semaphore,向.NET核心web服务发送大量请求时遇到问题。我使用信号量lim来限制同时请求的数量。当我收到10061错误(web服务已拒绝连接)时,我想拨回同时请求的数量。我目前的想法是取消对信号量lim的引用,并创建另一个: await this.semaphoreSlim.WaitAsync().ConfigureAwait(false); counter++; Uri uri = new Uri($"{api}/{keyProperty}", UriKi

向.NET核心web服务发送大量请求时遇到问题。我使用信号量lim来限制同时请求的数量。当我收到10061错误(web服务已拒绝连接)时,我想拨回同时请求的数量。我目前的想法是取消对信号量lim的引用,并创建另一个:

    await this.semaphoreSlim.WaitAsync().ConfigureAwait(false);
    counter++;

    Uri uri = new Uri($"{api}/{keyProperty}", UriKind.Relative);
    string rowVersion = string.Empty;
    try
    {
        HttpResponseMessage getResponse = await this.httpClient.GetAsync(uri).ConfigureAwait(false);
        if (getResponse.IsSuccessStatusCode)
        {
            using (HttpContent httpContent = getResponse.Content)
            {
                JObject currentObject = JObject.Parse(await httpContent.ReadAsStringAsync().ConfigureAwait(false));
                rowVersion = currentObject.Value<string>("rowVersion");
            }
        }
    }
    catch (HttpRequestException httpRequestException)
    {
        SocketException socketException = httpRequestException.InnerException as SocketException;
        if (socketException != null && socketException.ErrorCode == PutHandler.ConnectionRefused)
        {
            this.semaphoreSlim = new SemaphoreSlim(counter * 90 / 100, counter * 90 / 100);
        }
    }
}
finally
{
    this.semaphoreSlim.Release();
}
wait this.semaphoreSlim.WaitAsync().configurewait(false);
计数器++;
Uri=新Uri($“{api}/{keyProperty}”,UriKind.Relative);
string rowVersion=string.Empty;
尝试
{
HttpResponseMessage getResponse=wait this.httpClient.GetAsync(uri).ConfigureWait(false);
if(getResponse.IsSuccessStatusCode)
{
使用(HttpContent HttpContent=getResponse.Content)
{
JObject currentObject=JObject.Parse(wait-httpContent.ReadAsStringAsync().configurewait(false));
rowVersion=currentObject.Value(“rowVersion”);
}
}
}
捕获(HttpRequestException HttpRequestException)
{
SocketException SocketException=httpRequestException.InnerException作为SocketException;
if(socketException!=null&&socketException.ErrorCode==PutHandler.ConnectionRejected)
{
this.semaphoreSlim=新的信号量lim(计数器*90/100,计数器*90/100);
}
}
}
最后
{
this.semaphoreSlim.Release();
}

如果我这样做,等待我刚刚取消引用的信号量的其他任务会发生什么?我的猜测是,在对象被垃圾收集和处理之前,不会发生任何事情。

只要存在对它的引用,一个
信号量lim
(就像.NET中的任何其他对象一样)就会存在

但是,您的代码中有一个错误:正在释放的
SemaphoreSlim
this.SemaphoreSlim
,如果
this.SemaphoreSlim
在获取和释放之间发生了更改,那么代码将释放一个与已获取的不同的信号量。要避免此问题,请在方法开头将
this.semaphoreSlim
复制到局部变量中,然后获取并释放该局部变量

更广泛地说,在尝试的解决方案中存在一个困难。如果启动1000个任务,它们都将引用旧的信号量,并忽略更新的
this.sempahoresim
。所以你需要一个单独的解决方案。例如,您可以定义一个一次性“令牌”,即调用API的权限。然后创建这些令牌的异步集合(例如,通道)。这使您可以完全控制一次释放多少令牌