2016-11-06 4 views
1

내가 핸들러를 위임 사용자 정의 만든 무시했다가 모두있는 경우 너희들이 나를 올바른 하나입니다이 예를 알 수 있도록, 또는 수, 내가 정의 동기 방법을 실행하는 방법에 이제 방법SelfHost DelegatingHandler

Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 

입니다 내가 아니라 어떤 교착 상태

1.

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (Processor.CanProcess(request)) 
     { 
      var tsc = new TaskCompletionSource<HttpResponseMessage>(cancellationToken); 
      tsc.SetResult(Processor.Process(request)); 
      return tsc.Task; 
     } 
     return base.SendAsync(request, cancellationToken); 
    } 

2.

012을 피하기 위해, 더 나은 사용 알려 수정
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (Processor.CanProcess(request)) 
      return Task.Run(() => Processor.Process(request), cancellationToken); 
     return base.SendAsync(request, cancellationToken); 
    } 

비동기 대기 모드를 사용해야합니다. 그렇지 않으면 그대로 두는 것이 좋습니다.

+0

'Processor.Process'는 초당 얼마나 자주 실행됩니까? 자주 그렇지 않다면 당신이하는 일과 상관없이 가장 편리한 형태를 선택할 수 있습니다. – usr

+0

최악의 시나리오에서는 60ms마다 실행할 수 있으며 동시에 16 개의 요청을 수신 할 수 있습니다 –

답변

0

초당 Processor.Process가 얼마나 자주 실행됩니까? 자주 그렇지 않다면 당신이하는 일과 상관없이 가장 편리한 형태를 선택할 수 있습니다.

는 최악의 시나리오에서 모든 60ms를 실행할 수 있습니다, 그것은 아무것도 동시에

에서 16 개 요청을받을 수 있습니다. 나는 신경 쓰지 않을거야. 또한 비동기 API를 사용할 수 없기 때문에 할 수있는 일이별로 없습니다.

가장 편리한 형태를 선택했습니다. 나는이 같은 :

return Task.FromResult(Processor.Process(request)); 

취소 토큰은 여기에 어떤 영향을 미칠 그래서 그냥 그것을 떠나지 않습니다. Processor에서 협력 없이는 취소 할 수 없습니다.