2016-12-17 2 views
3

Попытка написать API, и у меня есть странный случай, который я пытался решить, как:Может ли метод async блокировать переменную вместо вызова метода?

 if (!request.WillCheckGetLater) 
     { 
      // Client calling is willing to wait only for certain amount of time 
      var clientWillingToWaitFor = GetResponseTime(request); 
      var needsToUpdateResponse = await AwaitResponse(heldBidRequest, clientWillingToWaitFor); 
      SendMessage(...); 
      return needsToUpdateResponse; 
     } 
     else 
     { 
      SendMessage(...); 
      return false; 
     } 

Хотя на мой пост метод, который я пытаюсь дождаться этого метода. В основном, когда я получаю сообщение, я строю «короткий» ответ, а клиент проверяет «длинный» ответ с помощью метода GET из API, но также может запрашивать непосредственно длинный ответ в POST, но должен указать, как он готов подождать этого долгого ответа, иначе я по умолчанию «короткий» ответ ...

Метод SendMessage - это, в основном, сторонняя система связи, в которой я подписываюсь и публикую сообщения.

прямо сейчас, когда линия

var needsToUpdateResponse = await AwaitResponse(heldBidRequest, clientWillingToWaitFor); 

выполняется, она блокирует этот кусок кода и SendMessage не будет выполняться до тех пор, задача более, в идеале я предпочел бы блокировал на возвращение вместо этого.

Мне не обязательно вызывать SendMessage. Сначала просто из-за странного сценария я мог получить ответ от сообщения, прежде чем я его настроил для его ожидания.

Любые идеи о том, что я могу использовать для этого?

ответ

5

Да

В самом деле, вы уже ждут на "переменной" (на самом деле возвращаемого значения). Вы не можете ждать метода, только задание. Просто хранить от задачи вместо T и await, когда вы будете готовы:

var needsToUpdateResponse = AwaitResponse(heldBidRequest, clientWillingToWaitFor); 
SendMessage(...); 
return await needsToUpdateResponse; 

Было бы более очевидным, если мы не использовали var:

Task<T> needsToUpdateResponse = AwaitResponse(heldBidRequest, clientWillingToWaitFor); 
SendMessage(...); 
return await needsToUpdateResponse; 
+0

благодарит Брэдли, это было так :) – CPay

0

Вы можете получить awaiter от задачи и получить результат, где вы хотите. Но в основном вы ждете этого метода, когда вам нужен результат.

См. Эту ссылку https://stackoverflow.com/a/17284612/819153