Я прочитал на асинхронной странице, и ее использование выглядит просто:
[ОБНОВЛЕНИЕ] Взято из здесь :
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
var task = new PageAsyncTask(BeginRequest, EndRequest, null, null);
RegisterAsyncTask(task);
}
IAsyncResult BeginRequest(Object sender, EventArgs e,
AsyncCallback cb, object state)
{
return _service.BeginHelloWorld(cb);
}
void EndRequest(IAsyncResult asyncResult)
{
var answer = _service.EndHelloWorld(asyncResult);
// do something with answer
}
Но я не могу разобраться со следующей проблемой:
Что, если я хочу вызвать асинхронную операцию / веб-сервис из моего бизнес-уровня и , а не непосредственно из кода моей страницы? Я не могу найти информацию об этом в сети.
Сценарий в двух словах:
Request
-> Page handler
-> Business layer service
- || -> External webservice
Одним из решений проблемы, о котором я могу подумать, было бы асинхронное обращение к сервису бизнес-уровня с использованием второго потока из пула потоков только в течение времени, необходимого для вызова внешнего веб-сервиса:
Request
-> Page handler
- || -> Business layer service
- || -> External webservice
. [ОБНОВЛЕНИЕ ->] Таким образом, в основном я думал о расширении вышеупомянутого подхода к моей службе бизнес-уровня, используя точно такой же шаблон. [<- END] </strong>
В этом случае оба потока будут выпущены в пул потоков (или, как я полагаю) и могут обрабатывать другие входящие запросы. Когда ответ из веб-службы возвращается, сначала поток связывается для обработки службы бизнес-уровня, а затем другой для завершения рендеринга страницы. Но это звучит как много накладных расходов - и в кодировании, и, возможно, даже во время выполнения.
Другим решением будет модификация первого, а именно: возврат незавершенного ответа клиенту после того, как мы вызовем внешний вызов веб-службы, и обработка его результата не в контексте запроса, а просто внутри приложения. Тогда, конечно, клиент должен будет опросить сервер на предмет результата, который должен был быть сохранен где-то. По сути, это идея, которую @emfurry выложил в Асинхронных вызовах веб-службы .
Есть ли другие жизнеспособные варианты, которые я не рассматривал?