Nano Hash - криптовалюты, майнинг, программирование

Async и Await в сообщении ApiController

Я до сих пор не совсем понимаю, что такое асинхронность и ожидание в .net 4.5. Пока, кажется, я понимаю, что ждут:

  1. помещает функцию (справа) в отдельный поток.
  2. возвращает выполнение вызывающему объекту текущей функции
  3. но удерживает остальную часть кода текущей функции «заложником», пока ожидающая (асинхронная) функция не завершится.

Пожалуйста, поправьте меня, если я что-то неправильно понимаю. Итак, если вышесказанное верно, я застрял с функцией Post ApiController, которую я хочу асинхронно:

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
{        
     myDataContext.MyObjects.InsertOnSubmit(obj);
     myDataContext.SubmitChanges();

     await SomeReallyLongRunningTaskAsync();        

     // obj would now have the new Id, which I'm really after.
     return Request.CreateResponse(HttpStatusCode.Created, obj);

}

Итак, если я правильно понимаю, Post завершит выполнение и вернет управление тому, кто вызвал myApiController.Post(obj). Но у меня еще нет объекта HttpResponseMessage, так как await держит return Request.CreateResponse(HttpStatusCode.Created, obj); "заложником".

В приведенном выше простом примере будет ли вызов немедленно возвращаться к клиенту (то есть к клиентскому веб-сайту JS или мобильному приложению)? Если да, то это будут 201, 400, 500 (лучше не надо), другие?


Ответы:


1

В дополнение к ответу Стивена мне нужно указать на несколько вещей.

Во-первых, асинхронность в контроллере не делает работу пользователя асинхронной. Пользователю придется ждать столько, сколько потребуется SomeReallyLongRunningTaskAsync(). [Так почему же мы делаем асинхронность? См. следующий пункт]

Кроме того, если SomeReallyLongRunningTaskAsync() привязан к процессору, вам не следует вызывать его в асинхронном режиме. Основная причина использования Async в сценарии с сервером — освобождение потока CLR обратно в пул, чтобы порт завершения ввода-вывода (IOCP) может справиться с остальным - до тех пор, пока не будет выполнена работа ввода-вывода, которая затем вернется в пул потоков. Это предотвратит проблему нехватки потоков, которая часто встречается в сценариях ASP.NET.

IOCP используются ТОЛЬКО в привязанных к IO ситуациях, например:

  • чтение/запись в файл
  • доступ к базе данных или
  • доступ к внешней веб-службе или службе WCF

В Интернете доступно множество ресурсов, объясняющих различные аспекты. Если можно, вставьте заглушку, глава 2 этой книги — отличный ресурс, дающий целостное представление об асинхронности в веб-API.

11.10.2013

2

помещает функцию (справа) в отдельный поток.

Нет. async не начинает новый поток. У меня есть async введение, которое может оказаться полезным для вас.

Post завершит выполнение и вернет управление тому, кто вызвал myApiController.Post(obj). Но у меня еще нет объекта HttpResponseMessage

Правильный.

В приведенном выше простом примере будет ли вызов немедленно возвращаться к клиенту (то есть к клиентскому веб-сайту JS или мобильному приложению)?

Нет. ASP.NET MVC 4.5 видит, что вы возвращаете Task<HttpResponseMessage>, а не HttpResponseMessage, поэтому он не отправит ответ, пока ваш Task не будет завершен (в конце вашего метода async Post).

10.10.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..