2015-08-11 3 views
1

Какая польза от ожидания синхронного repo.GetCategories вызывает доступность конечной точки?Ожидает синхронный метод с Task.FromResult имеет смысл

Моим первым умом было то, что не имеет смысла. Но я не уверен.

[HttpGet] 
public async Task<IHttpActionResult> Get(string country) 
{ 
    var result = repo.GetCategories(new List<string> { country}); 
    return await Task.FromResult(Ok(result)); 
} 

ответ

3

Моим первым умом было то, что не имеет смысла.

Ваш разум прав. Если текущая работа не является асинхронной, зачем вообще переносить ее на Task? Если вы не переопределяется метод, объявленный в базовом классе, который вы не имеете никакого контроля над, это было бы лучше:

[HttpGet] 
public IHttpActionResult Get(string country) 
{ 
    var result = repo.GetCategories(new List<string> { country}); 
    return Ok(result); 
} 

Если вы не имеете никакого контроля над упомянутым способом, то нет никакого смысла в ожидании его. Task.FromResult просто обернет ваш синхронный результат TaskCompletionSource<T>. Нет ничего неотъемлемо асинхронного, происходящего за кулисами.

+0

Не так ли, что методы WebAPI * have * возвращают задачу? Я никогда не пробовал ... – Luaan

+0

@ Luaan Нет, такой необходимости нет. –

0

С точки зрения доступности, это не поможет один бит - вы по-прежнему блокирует поток от GetCategories вызова. Вы бы получить эквивалентное поведение с помощью

[HttpGet] 
public async Task<IHttpActionResult> Get(string country) 
{ 
    var result = repo.GetCategories(new List<string> { country }); 
    return Ok(result); 
} 

или

[HttpGet] 
public Task<IHttpActionResult> Get(string country) 
{ 
    var result = repo.GetCategories(new List<string> { country }); 
    return Task.FromResult(Ok(result)); 
} 

Они работают одинаково для обработки исключений по-разному (в случае async + await, они всегда завернуты в Task), но кроме неважно, ожидаете ли вы Get в любом случае. Однако было бы полезно, если бы вы использовали ручные продолжения или задержки ожидания.

В конце концов, если у вас есть много таких вызовов, веб-сервер/приложение просто создаст больше потоков для обработки запросов, поэтому вы даже не повредите доступность - накладные расходы больше; вы можете обрабатывать более параллельные запросы с асинхронным кодом, и для этого обычно требуется меньше памяти.

0

Не имеет смысла, чтобы ключевое слово Await использовалось с ключевым словом Async для генерации кода, который выполняется асинхронно в богатых выражениях winForm, чтобы сделать пользовательский интерфейс более восприимчивым к обработке длинных методов, это может иметь смысл, если ваш репо. GetCategories занимает несколько секунд, но не в этом контексте веб-запроса.

+0

Это всего лишь одна крошечная часть полезности 'await'. И в любом случае, это не повлияет на пользовательский интерфейс, потому что здесь нет асинхронного метода «асинхронный», он полностью завершится, блокируя вызывающий поток. – Luaan

+0

Это был момент, который я пытался сделать, я не знал о блокирующей части, но спасибо за информацию, я попытаюсь очистить свой ответ, чтобы быть более понятным –

Смежные вопросы