2016-11-06 5 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); 
    } 

と私はasync awaitを使用するか、そのまま残す方が良いです。

+0

「Processor.Process」は1秒あたりどのくらいの頻度で実行されますか?頻繁ではない場合は、あなたが何をしているかは関係ありませんし、最も便利なフォームを選ぶことができます。 – usr

+0

最悪のシナリオでは、60msごとに実行でき、同時に16の要求を受信できます –

答えて

0

Processor.Processは1秒あたりどのくらいの頻度で実行されますか?頻繁ではない場合は、あなたが何をしているかは関係ありませんし、最も便利なフォームを選ぶことができます。最悪のシナリオで

それはすべての60ミリ秒を実行することができ、そしてそれは何もない、同時に16件のリクエスト

を受け取ることができます。私は無関心だろう。また、非同期APIを使用することができないため、できることはあまりありません。

最も便利なフォームを選択しました。私はこの1つが好きです:

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

キャンセルトークンはここでは何の効果もありません。 Processorからの協力なしにキャンセルはありません。

関連する問題