2017-03-20 16 views
0

一度に1つのスレッドだけがサービスを呼び出し、最初のスレッドがまだ実行している間に後のものを破棄するようにします。コンストラクタでSemaphoreSlimによるスレッド調整

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

_ _「それはSemaphoreSlimクラスを使用することによって達成することができます」 - おそらく。あなたの質問に良い[mcve]なしで言うことは不可能であり、 "それはできますか?"とにかく質問は本質的に広すぎます。しかし、最初のカウントが1であるセマフォは、すぐにセマフォを取得しようとするために 'Wait(0)'を使うことができます。取得に失敗した場合、タスクはすでに実行中であり、そのタスクをスキップすることができます。タスクが完了したときにセマフォを解放するために 'finally'を使うのを忘れないでください。 –

答えて

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  
} 
+0

0-msタイムアウトでコールを待つのは何ですか? –

+0

@PeterDunihoセマフォがすでにいっぱいの場合、メソッドは直ちにfalseを返し、それを待たない。 –

+0

私はそれを知っています。別の言い方をすれば、コールは常に即座に戻ります。だから、私はあなたにもう一度尋ねます:なぜコールを待っていますか? –