使用SemaphoreSlim

时间:2017-03-20 07:25:08

标签: c# asynchronous task semaphore

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

  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);

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

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    
}