我已经阅读了 Async Page 及其用法,看起来很简单:
[更新]取自这里:
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
}
但我无法解决以下问题:
如果我想从我的业务层而不是直接从我的页面的代码隐藏调用异步操作/Web 服务怎么办?我似乎无法在网上找到任何关于此的信息。
简而言之,场景:
Request
--> Page handler
--> Business layer service
- || ->External webservice
我能想到的问题的一种解决方案是异步调用业务层服务,仅在调用外部 Web 服务所需的时间内使用线程池中的第二个线程:
Request
--> Page handler
- || -> Business layer service
- || -> External webservice
。[更新->]所以基本上我想使用完全相同的模式将上述方法扩展到我的业务层服务。[<-结束]
在这种情况下,两个线程都将被释放到线程池(或者我猜是这样),并且可以处理其他传入的请求。当 webservice 的应答返回时,首先会绑定一个线程来处理业务层服务,然后再绑定一个线程来完成 Page 渲染。但这听起来像是很多开销——无论是在编码方面,甚至在运行时。
另一种解决方案是对第一个解决方案的修改 - 即,一旦我们触发外部 web 服务调用并在应用程序内部而不是在请求的上下文中处理它的结果,就会向客户端返回一个未完成的响应。然后,当然,客户端必须轮询服务器以获取应该保存在某处的结果。这基本上是 @emfurry 在Async Web Service Calls中提出的想法。
我还没有考虑过其他可行的选择吗?