Должны ли syn c API-вызовы быть заключены в asyn c? - PullRequest
0 голосов
/ 08 января 2020

Я прочитал некоторые посты и статьи на inte rnet, в которых говорится, что я не должен использовать asyn c, пока мои вызовы не станут IO (чтение файла, отправка запроса и т. Д. c.). Но если вызывающий API на самом деле связан с IO и не поддерживает асинхронные вызовы c, я должен обернуть их Task.Run()?

Скажите, если у меня сервер MVC вызывает внешний сервер через API для получения данных, но в API нет методов asyn c. Есть ли в этом случае преимущество переноса вызовов syn c с asyn c?

Как я понимаю, если не перенос, то все вызовы API являются syn c, и каждый вызов my * Приложение 1026 * использует поток из пула потоков. Во втором случае Task.Run() поставит мою задачу в очередь потоков, но освободит основной поток. Является ли выпущенная основная тема полезной, или ее не стоит оборачивать? Правильно ли я здесь?

РЕДАКТИРОВАТЬ Хорошо, вот еще некоторые подробности, запрошенные людьми.

У меня есть сторонняя организация. NET сборка, которую я ' Я вынужден использовать. Я не могу просто позвонить на веб-сервис напрямую. Это выглядит примерно так:

// the API (I not owner of it, can't change it):
public class Service {
  /* everything is synchronous like this. but somewhere inside
   it still makes HTTP requests to external server, so that's 
   kinda IO. just the lib is very old and doesn't provide async methods*/
  public Data GetData(Paramters parameters);
}

// here comes my code.
// option 1. sync controller
public class MyController {
  public ActionResult GetDataById(string id) {
     var data = new Service().GetData(new Parameters{Id = id});
     // process and return some result ...
  }
}

// option 2. async controller
public class MyController {
  public async ActionResult GetDataById(string id) {
     var result = await Task.Run(() => new Service().GetData(new Parameters{Id = id}));
     // process and return some result ...
  }
}

Итак, вопрос в том, имеет ли смысл использовать вариант 2?

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Допустим, если сам API выполняет задачи, связанные с вводом-выводом, даже тогда, когда свободный главный поток будет полезен вам, если пользователь выберет выполнение нескольких задач через API, вы получите преимущество, если основной поток будет свободен, а не заблокирован на разовый запрос

0 голосов
/ 08 января 2020

Оборачивая в asyn c, вы можете получить преимущество от выполнения параллельных вызовов на внешний сервер, в то время как фактический вызов все еще остается синхронизированным c, так что это будет похоже на несколько потоков, каждый из которых ожидает ответа от внешнего сервера. , Я сделал это, и было бы полезно, если бы вы хотели обработать сбои, и тогда приложение не застряло бы в вызывающих потоках.

...