我有一个网站,它经常向外部 Web 服务发出请求,我希望这些调用是异步和并行的,以避免阻塞并稍微加快网站速度。基本上,我有 8 个小部件,每个小部件都必须进行自己的网络调用。
出于某种原因,它们中只有前 3 个左右真正加载异步,然后线程没有及时释放,其余的小部件按顺序加载。如果我能让其中 3 个并行加载,然后再并行加载 3 个,再并行加载 2 个,我会很高兴。所以问题实际上是线程没有及时释放。
我猜答案与一些 IIS 配置有关。我正在非服务器操作系统上进行测试,所以也许这是其中的一部分。
编辑@jon skeet:
我正在使用反射来调用这样的网络调用:
output = methodInfo.Invoke(webservice, parameters);
小部件操作(最终调用 Web 服务)通过 jquery $.each() 循环和 .load 函数调用(也许这会导致瓶颈?)。小部件操作在异步控制器中设置为异步方法。
这是其中一种异步方法的代码(它们都是这样设置的):
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,对吧?