Я читал на странице Async, и ее использование выглядит просто:
[ОБНОВЛЕНИЕ] Взято из здесь:
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] В этом случае оба потока будут выпущены в пул потоков (или я так полагаю) и смогут обрабатывать другие входящие запросы. Когда возвращается ответ от веб-службы, сначала связывается поток для обработки службы бизнес-уровня, а затем другой поток для завершения рендеринга страницы. Но это звучит как много накладных расходов - как при кодировании, так и, возможно, даже во время выполнения.
Другим решением может быть модификация первого, а именно, возврат незавершенного ответа клиенту после того, как мы инициируем вызов внешнего веб-сервиса, и обработка его результата не в контексте запроса, а просто внутри приложения. Тогда, конечно, клиенту нужно будет опросить сервер, чтобы узнать результат, который нужно было где-то сохранить. По сути, это идея @emfurry, изложенная в вызовах асинхронных веб-служб.
Есть ли другие жизнеспособные варианты, которые я не рассматривал?