C# 使用信号量lim进行线程节流

C# 使用信号量lim进行线程节流,c#,asynchronous,task,semaphore,C#,Asynchronous,Task,Semaphore,我希望确保一次只有一个线程调用该服务,在第一个线程仍在执行时丢弃后面的线程 await throttler.WaitAsync(); T result = default(T); HttpResponseMessage response = await Client.Proxy.PostAsJsonAsync(path, request); if (response.IsSuccessStatusCode) {

我希望确保一次只有一个线程调用该服务,在第一个线程仍在执行时丢弃后面的线程

  await throttler.WaitAsync();
        T result = default(T);
        HttpResponseMessage response = await Client.Proxy.PostAsJsonAsync(path, request);
        if (response.IsSuccessStatusCode)
        {
            result = await response.Content.ReadAsAsync<T>();
            throttler.Release();
        }
        else
        {
            throttler.Release();
        }
        return result;
wait throttler.WaitAsync();
T结果=默认值(T);
HttpResponseMessage response=wait Client.Proxy.PostAsJsonAsync(路径,请求);
if(响应。IsSuccessStatusCode)
{
结果=wait response.Content.ReadAsAsync();
节流器释放();
}
其他的
{
节流器释放();
}
返回结果;
在构造函数中,我有
throttler=newsystem.Threading.SemaphoreSlim(1,1)

一次只向服务器发送一个请求。但是,如果请求仍在执行,我还想终止所有后续请求。

当线程已经在调用服务时,您可以使用放弃其他调用:

  await throttler.WaitAsync();
        T result = default(T);
        HttpResponseMessage response = await Client.Proxy.PostAsJsonAsync(path, request);
        if (response.IsSuccessStatusCode)
        {
            result = await response.Content.ReadAsAsync<T>();
            throttler.Release();
        }
        else
        {
            throttler.Release();
        }
        return result;
bool entered = await semaphore.WaitAsync(TimeSpan.Zero);
if (entered) {
    try {
        HttpResponseMessage response = await Client.Proxy.PostAsJsonAsync(path, request);
    }
    finally {
        semaphore.Release();
    }
}
else {
    // Discarded: Another service call is in progress    
}

“它可以通过使用SemaphoreSlim类来实现”——可能是这样。在你的问题中,没有一个好的答案是不可能说的,而且“能做到吗?”问题本身就太宽泛了。但是对于初始计数为1的信号量,您可以使用
Wait(0)
尝试立即获取信号量;如果您未能获取该任务,则您知道该任务已在执行,可以跳过该任务。不要忘记使用
finally
来确保在任务完成时释放信号量。@PeterDuniho如果信号量已满,该方法将立即返回false,并且不会等待它。我知道这一点。换句话说,电话总是会立即返回。所以,我再次问你:为什么要等电话?@PeterDuniho所以如果我用Wait(0)代替,你会很高兴吗?没有区别,因为调用方法无论如何都需要是异步的。但是,如果要在1毫秒后将0更改为1毫秒,则不需要在以后更改方法名称。@MehrzadChehraz我希望在线程已在调用服务时放弃其他调用。@VaibhavJain代码就是这样做的。如果WaitAsync方法返回false(另一个调用服务的线程),“entered”变量将为false,调用将被丢弃。