2015-01-30 3 views
2

Я новичок в использовании AngularJS с MVC 5 и я смотрел на использование Web API с AngularJS так как кажется, как хорошее решение для загрузки данных в ваши клиентских модели.Web API методы асинхронные с AngularJS

Однако я заметил, что довольно много гидов использовать асинхронные действия, которые возвращают Task<Model>, и я не понимаю, какая пользу это дает вам по сравнению с использованием только стандартные Web API действия (примеров: http://monox.mono-software.com/blog/post/Mono/233/Async-upload-using-angular-file-upload-directive-and-net-WebAPI-service/ и http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/build-a-single-page-application-%28spa%29-with-aspnet-web-api-and-angularjs).

Поскольку эти вызовы API веб-интерфейса асинхронны, я не знаю, почему мы должны сделать эти вызовы асинхронными. Разве не лучше было бы использовать только стандартные вызовы Web API?

Я не знаю, подходит ли stackoverflow для этого, но я надеялся, что объясню, почему вызовы выполняются таким образом.

+2

Точка асинхронных методов на сервере - это просто избежать потерь потоков, для масштабируемости. Прочитайте http://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/ – SLaks

ответ

6

Преимущество async-await на сервере - это масштабируемость и производительность. Когда вы заменяете синхронные (блокирующие) операции с асинхронными (неблокирующими), вы освобождаете потоки, которые ранее были заблокированы, и которые вы можете использовать для одновременного обращения с другими запросами.

async-await позволяет вам делать больше с меньшими ресурсами.

Давайте предположим, что у нас есть этот синхронный метод:

public void Process() 
{ 
    for (int i = 0; i < 1000; i++) 
    { 
     Math.Sqrt(i); 
    } 

    Thread.Sleep(3000); // sync I/O 
} 

Делая это async:

public async Task ProcessAsync() 
{ 
    for (int i = 0; i < 1000; i++) 
    { 
     Math.Sqrt(i); 
    } 

    await Task.Delay(3000) // async I/O 
} 

Мы можем использовать один поток для обработки нескольких запросов одного и того же метода, так как обработку нить запрос освобождается, когда вы выполняете асинхронную операцию await.

+0

Я понимаю, что async-ждут делает то, что я не понимаю, поэтому в некоторых из этих методов они беспокоили использовать его там, где я не вижу никакой пользы. Например, одним способом они ждут при вызове асинхронного вызова, а все остальные методы проверяют, является ли результат нулевым, а если он возвращает значение и если не возвращает другое значение. Итак, поскольку вы на самом деле не выполняете никаких других операций, кроме ожидая, когда асинхронный вызов завершится, зачем вообще использовать его? – Serberuss

+0

@Serberuss. Откуда вы знаете, что никаких других операций нет? Представьте, что вы получаете запрос от другого клиента в точное время. Большинство приложений Web API не ограничиваются одним синхронным клиентом. – i3arnon

+0

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

1

Чтобы дать еще один показательный пример:

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

Без асинхронизации, в течение 1 секунды в запросах используются 2 потока.

С асинхронным (реализованным вплоть до вызова базы данных), через 1 секунду в запросах используется 1 поток, обрабатывающий логику приложения. Другой запрос находится в состоянии ожидания (без использования нити).

Оба запроса займет 2 секунды, но в сценарии асинхронного количество активных потоков уменьшается для некоторых из длительности запроса

+0

Итак, вы говорите, что ничего не заметите с точки зрения клиента, но для сервера это более эффективно? Я все еще не совсем уверен, почему я не видел этого в синхронных вызовах MVC-действия, где выполняются вызовы баз данных или в приложениях WPF. – Serberuss

+0

Да, это влияет на объединение потоков и в .net влияние потока на поток может составлять около 1 МБ для активного потока. Таким образом, вы действительно заметили бы только на уровне сотен одновременных запросов. – Kaido

1

Асинхронных ждет на стороне сервера, не для включения/усиления асинхронных XMLHttpRequests (AJAX звонков). Он должен включать ключевое слово ожидания и обработку методов, возвращающих задачи в коде нижнего уровня и код на стороне сервера, если вы решите реализовать их. Этот пример приходит на ум:

Диспетчер диспетчера API-интерфейса API API запускает контроллер в ответ на запрос и сообщает ему, чтобы он выполнил действие. Затем нужно посмотреть на ответ и принять меры в зависимости от результата (ошибка и т. Д.). Если он выполняет синхронную отправку, поток блокируется диспетчером, ожидающим завершения действия, когда это не обязательно.В асинхронном контексте этот диспетчер может ожидать ответа от контроллера, и поток освобождается для выполнения других задач. Когда действие первоначального контроллера будет выполнено, любая свободная нить может забрать, где первая нить прекратилась, и обработать остальную часть отправки.

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