Asp.net 异步web调用瓶颈和顺序运行

Asp.net 异步web调用瓶颈和顺序运行,asp.net,multithreading,iis,asynchronous,web,Asp.net,Multithreading,Iis,Asynchronous,Web,我有一个经常向外部web服务发出请求的web站点,我希望这些调用是异步和并行的,以避免阻塞并稍微加快站点的速度。基本上,我有8个小部件,每个小部件都必须进行自己的web调用 出于某种原因,只有前3个左右的小部件真正加载异步,然后线程不能及时释放,其余的小部件依次加载。如果我能让其中3个并行加载,然后再并行加载3个,再并行加载2个,我会很高兴。所以问题是线程没有及时释放 我猜答案与一些IIS配置有关。我正在一个非服务器操作系统上测试,所以这可能是它的一部分 为@jon skeet编辑: 我使用反射

我有一个经常向外部web服务发出请求的web站点,我希望这些调用是异步和并行的,以避免阻塞并稍微加快站点的速度。基本上,我有8个小部件,每个小部件都必须进行自己的web调用

出于某种原因,只有前3个左右的小部件真正加载异步,然后线程不能及时释放,其余的小部件依次加载。如果我能让其中3个并行加载,然后再并行加载3个,再并行加载2个,我会很高兴。所以问题是线程没有及时释放

我猜答案与一些IIS配置有关。我正在一个非服务器操作系统上测试,所以这可能是它的一部分

为@jon skeet编辑:

我使用反射调用web调用,如下所示:

output = methodInfo.Invoke(webservice, parameters);
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);
        }
    }
小部件操作(最终调用web服务)是通过jquery$.each()循环和.load函数调用的(这可能会导致瓶颈?)。小部件操作在异步控制器中设置为异步方法

下面是其中一个异步方法的代码(它们都是这样设置的):

public void MarketTradeWidgetAsync()
{
AsyncManager.OutstandingOperations.Increment();
//一堆市场交易逻辑
//这最终会调用web服务
PlanUISetting uiSettingMarketQuotesConfig=WebSettingsProviderManager.Provider.GetMarketQuotes(System.Configuration.ConfigurationManager.AppSettings[“Theme”]、SessionValues.GlobalPlanID、SessionValues.ParticipanId、“MARKETQUOTES”);
AsyncManager.OutstandingOperations.Decrement();
}
公共操作结果MarketTradeWidgetCompleted(MarketTradeTool MarketTradeTool)
{
if(Session.IsNewSession)
返回PartialView(“../Error/AjaxSessionExpired”);
其他的
{
ViewData[“MarketData”]=markettradetool;
return PartialView(markettradetool);
}
}

正如我所说,这些方法是通过jquery调用的。我的想法是,由于操作方法是异步的,它们应该在被调用后将控制权交还给jquery,对吗?

SessionState=“readonly”针对当前页面修复了这个问题。显然,会话锁定是问题所在。

请显示您用于调用web服务的代码。编辑后的代码中包含了一点关于工作流程的信息,我觉得它不是特别异步的。再说一次,更多的信息真的会很有帮助……哦,顺便说一下,我在几周前读了你的文章《让反思飞翔》,学到了很多。实际上,我试图用委托替换反射,但最终不得不回到reflectionwell,我希望由于小部件操作方法是异步方法,jquery将异步调用所有这些方法。不幸的是,我不能提供更多的信息。它看起来像是异步工作到某一点,然后它耗尽了线程,并且从不回收它们。。