Как ожидать результата асинхронного вызова веб-службы в ASP.NET для лучшей производительности - PullRequest
7 голосов
/ 08 февраля 2012

На сайте WebForms ASP.NET (IIS, один пул приложений) у меня есть вызов длинного метода веб-службы, на который ссылается Visual Studio в качестве ссылки на службу (.NET 4.0). К сожалению, я должен ждать информацию от веб-службы, прежде чем я смогу предоставить страницу пользователю. В настоящее время веб-служба вызывается синхронно, поэтому сервер не может повторно использовать текущий поток для обработки других запросов, что влияет на производительность.

Конечно, я могу генерировать асинхронные операции для ссылки на службу в Visual Studio и вызывать BeginGetFoo вместо GetFoo, но все же я должен как-то дождаться результата от веб-службы.

Здесь возникает вопрос. Если я использую AsyncWaitHandle.WaitOne (как показано ниже), будет ли лучше в плане производительности всего приложения синхронный вызов, который я использую сегодня?

IAsyncResult result = fooSoapClient.BeginGetFoo();
result.AsyncWaitHandle.WaitOne();
var foo = fooSoapClient.EndGetFoo(result);

И, конечно, если ожидание может быть лучше, я открыт для предложений.

Ответы [ 3 ]

10 голосов
/ 08 февраля 2012

Вы хотите использовать асинхронную страницу.См. « Злой код: масштабируемые приложения с асинхронным программированием в ASP.NET », а также Асинхронные страницы в ASP.NET 2.0 , в которых говорится о веб-службах и асинхронных задачах с RegisterAsyncTask.

0 голосов
/ 08 февраля 2012

Если рефакторинг вашего кода неприемлем, поэтому вы не можете следовать ответу @John Saunders, тогда единственное, что вы можете сделать, - это увеличить количество потоков для приложения.Это позволит вам лучше масштабировать, но в какой-то момент у вас будет убывающая отдача, и вы начнете снижать производительность.Более того, если у вас нет пользователей, ожидающих в очереди запросов (т.е. более 25 одновременных пользователей на ядро ​​на вашем сервере), вам не нужно ничего делать.Асинхронное программирование на веб-сервере помогает только с масштабируемостью, но не фактической производительностью для одного пользователя.

0 голосов
/ 08 февраля 2012

Ты бы все еще цеплялся за нить. «Безопасным» вариантом будет использование асинхронных контроллеров ASP.NET MVC: http://www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx

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

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