2017-03-20 1 views
0

한 스레드가 한 번에 하나의 스레드 만 호출하도록하고 싶습니다. 처음 스레드가 아직 실행 중일 때 이후 스레드를 삭제합니다. 생성자에서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

나는 그것을 안다. 다시 말하면, 전화는 항상 즉시 반환됩니다. 그래서 나는 다시 묻는다. 왜 전화를 기다리는거야? –

관련 문제