外部のWebサービスに頻繁にリクエストを送信するWebサイトがあります。ブロックを回避し、サイトを少し高速化するために、これらの呼び出しを非同期で並列にしたいと思います。基本的に、私は8つのウィジェットを持っており、それぞれが独自のWeb呼び出しを行う必要があります。
何らかの理由で、最初の3つ程度だけが本当に非同期でロードされ、その後スレッドは時間内に解放されず、残りのウィジェットは順次ロードされます。それらのうちの3つを並列にロードし、次に3つを並列にロードし、さらに2つを並列にロードできるとしたら、私は幸せです。したがって、問題は、スレッドが時間内に解放されていないことです。
答えはIISの構成に関係していると思います。私は非サーバーOSでテストしているので、おそらくそれはその一部です。
@jon skeetの編集:
私はリフレクションを使用して、次のようなWeb呼び出しを呼び出しています。
output = methodInfo.Invoke(webservice, parameters);
ウィジェットアクション(最終的にWebサービスを呼び出す)は、jquery $ .each()ループと.load関数を介して呼び出されます(これによりボトルネックが発生する可能性がありますか?)。ウィジェットアクションは、非同期コントローラーの非同期メソッドとして設定されます。
非同期メソッドの1つのコードは次のとおりです(これらはすべて次のように設定されています)。
public void MarketTradeWidgetAsync()
{
AsyncManager.OutstandingOperations.Increment();
//a bunch of market trade logic
//this eventually calls the web service
PlanUISetting uiSettingMarketQuotesConfig = WebSettingsProviderManager.Provider.GetMarketQuotes(System.Configuration.ConfigurationManager.AppSettings["Theme"], SessionValues<String>.GlobalPlanID, SessionValues<String>.ParticipantID, "MARKETQUOTES");
AsyncManager.OutstandingOperations.Decrement();
}
public ActionResult MarketTradeWidgetCompleted(MarketTradeTool markettradetool)
{
if (Session.IsNewSession)
return PartialView("../Error/AjaxSessionExpired");
else
{
ViewData["MarketData"] = markettradetool;
return PartialView(markettradetool);
}
}
そして、私が言ったように、これらのメソッドはjqueryを介して呼び出されます。私の考えでは、アクションメソッドは非同期であるため、呼び出された後、jqueryに制御を戻す必要があります。