私は 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
私が考えることができる問題の 1 つの解決策は、外部 Web サービスの呼び出しに必要な時間だけ、スレッド プールから 2 番目のスレッドを利用して、ビジネス レイヤー サービスを非同期で呼び出すこと
Request
ですPage handler
。-> Business layer service
- || -> External webservice
. [UPDATE ->]基本的に、まったく同じパターンを使用して、上記のアプローチをビジネスレイヤーサービスに拡張することを考えました。[<-終了]
この場合、両方のスレッドがスレッド プールに解放され (またはそう推測されます)、他の着信要求を処理できます。Web サービスからの応答が返されると、最初にスレッドがビジネス レイヤー サービスを処理するためにバインドされ、次にページのレンダリングを完了するために別のスレッドがバインドされます。しかし、それはかなりのオーバーヘッドのように思えます - コーディングとおそらく実行時の両方で。
別の解決策は、最初のものを変更することです。つまり、外部 Web サービス呼び出しをトリガーすると、クライアントに未完成の応答を返し、その結果を要求のコンテキストではなく、単にアプリケーション内で処理します。次に、もちろん、クライアントはサーバーにポーリングして、どこかに保存されているはずの結果を取得する必要があります。これは基本的に、@emfurry がAsync Web Service Callsでレイアウトしたアイデアです。
私が考慮していない他の実行可能なオプションはありますか?