Есть ли способ для метода веб-службы ASP.NET использовать асинхронные методы? - PullRequest
0 голосов
/ 28 апреля 2009

У меня есть веб-служба ASP.NET (.asmx) с простым методом, который читает что-то из БД с помощью вызова синхронизации (ExecuteReader) и возвращает результат. Есть ли способ оптимизировать использование пула потоков (т. Е. Путем вызова асинхронного вызова (BeginExecuteReader)) без изменения сигнатуры метода?

Намерение состоит в том, чтобы не блокировать поток пула потоков во время выполнения операции базы данных; Мы не стремимся ускорить процесс, выполняя несколько операций параллельно.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2009

На самом деле ответ да . См. Асинхронные методы веб-службы XML .

Хотя вы создаете асинхронный веб-метод с методами Begin * и End *, .NET создает только одну операцию в WSDL. Это очевидно, если подумать - что бы Java-клиент делал с IAsyncResult?

Клиент может вызывать операцию синхронно или асинхронно.

2 голосов
/ 28 апреля 2009

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

[WebMethod]
public SomeResult SynchronousMethod() {
    IAsyncResult someWork = BeginSomeAsyncWork();
    IAsyncResult otherWork = BeginOtherAsyncWork();
    WaitHandle[] all = new WaitHandle[] { someWork.AsyncWaitHandle, otherWork.AsyncWaitHandle };
    // TODO: Do some synchronous work here, if you need to 
    WaitHandle.WaitAll(all); /* this is the important part, it waits for all of the async work to be complete */
   var someWorkResult = EndSomeAsyncWork(someWork);
   var otherWorkResult = EndSomeAsyncWork(otherWork);
   // TODO: Process the results from the async work
   // TODO: Return data to the client
}

Важной вещью здесь является WaitHandle.WaitAll , которая будет блокировать, пока вся асинхронная работа не будет завершена. Если вы можете обрабатывать результаты по отдельности, вы можете использовать WaitHandle.WaitAny , но код становится более сложным и немного выходит за рамки вопроса.

1 голос
/ 28 апреля 2009

Да, вы в основном можете делать то, что хотите, отвечая на запрос на обслуживание. Но если у вас есть только 1 запрос, он не будет особенно полезен. Если вам нужно 2 или более запросов, это становится интересным.


И, конечно, вы должны собрать все результаты, как указывает Алекс Лайман. ASP.NET WebPage имеет специальную поддержку для этого, поэтому я уверен, что это возможно.

0 голосов
/ 28 апреля 2009

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

Краткий ответ - нет. Люди, кажется, только читают эту строку и голосуют вниз :) Пользователь спрашивает, можем ли мы сделать асинхронный вызов изнутри вызова веб-службы синхронизации, что, безусловно, возможно при использовании WaitHandles, но не имеет смысла в конкретном случае пользователя.

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