我想确保一次只有一个线程调用该服务,在第一个线程仍在执行时丢弃后一个线程。
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;
在构造函数中,我有throttler = new System.Threading.SemaphoreSlim(1, 1);
一次只向服务器发送一个请求。但是,如果请求仍在执行,我还想杀死所有后来的请求。
答案 0 :(得分:1)
当线程已经在调用服务时,您可以使用WaitAsync(TimeSpan)来放弃其他呼叫:
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
}