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,调用将被丢弃。