0

外部の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に制御を戻す必要があります。

4

1 に答える 1

0

手元のページの SessionState = "readonly" により、この問題が修正されました。明らかに、セッションのロックが問題でした。

于 2012-05-02T18:11:26.757 に答える