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.

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 для ожидания или лучше оставить его как есть.

+0

Как часто выполняется «Processor.Process» в секунду? Если не часто, то не имеет значения, что вы делаете, и вы можете выбрать наиболее удобную форму. – usr

+0

В худшем случае он может работать каждые 60 мс, и он может одновременно получать 16 запросов –

ответ

0

Как часто работает Processor.Process в секунду? Если не часто, то не имеет значения, что вы делаете, и вы можете выбрать наиболее удобную форму.

в худшем случае она может работать каждый 60мс, и он может получить 16 запросов одновременно

Это ничего. Я был бы безразличен. Кроме того, поскольку у вас нет доступных асинхронных API, вы не можете многое сделать.

Выберите наиболее удобную форму. Мне нравится этот:

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

Значок аннулирования здесь не имеет никакого эффекта, поэтому просто оставьте его. Без сотрудничества от Processor.