3

ボタンのあるページがあり、ボタンをクリックしてデータを非同期で 2 つのデータ グリッドにロードしたいと考えています。

これはページのコードです。jquery を使用して、html を生成する他の 2 つのページを呼び出します。

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Solutions_CashCenter_StockManagement_Test_Test" %>
<asp:Content ID="Content2" ContentPlaceHolderID="cphCenter" Runat="Server">
<style type="text/css">
    #wait {
    position:absolute;
    top:0px;
    right:10px;
    width:200px;
    z-index:1000;
    vertical-align:middle;
    text-align:center;
    background: #febf00;
    display:none;
}
</style>
<script src='<%= ResolveUrl("../../../../Scripts/jquery-1.4.1.js") %>' type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        $('#wait')
        .ajaxStart(function () { $(this).show(); })
        .ajaxStop(function () { $(this).hide(); });

        $('input:button').live('click', loadData);
    });

    function loadData() {
        $.get("Source.aspx", {},
        function (data) {
            $('#a1').html(data);
        },
        "html");

        alert('This alert is asynchronous (1st)');

        $.get("Source2.aspx", {},
        function (data) {
            $('#a2').html(data);
        },
        "html");

        alert('This alert is asynchronous (2nd)');
    }
</script>
<div id="test13">
    <input type="button" id="btnLoad" value="Load" />
</div>
<div id="a1"></div>
<div id="a2"></div>
<div id="wait">Please wait <img src="ajax-loading.gif" /></div>
</asp:Content>

次に、Source1.aspx と Source2.aspx の 2 つの aspx ページがあります。これらには、gridDataView と OnLoad イベントの小さなコードのみが含まれています。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Source.aspx.cs" Inherits="Solutions_CashCenter_StockManagement_Test_Source" %>
<form runat="server">
<cc1:GridDataView runat="server" ID="gridTest" >
</cc1:GridDataView>
<asp:SqlDataSource ID="dsTest" runat="server" ConnectionString="<%$ ConnectionStrings:WebPortalConnectionString %>"
    ProviderName="<%$ ConnectionStrings:WebPortalConnectionString.ProviderName %>">
</asp:SqlDataSource>
</form>

サーバ側:

Thread.Sleep(5000);
dsTest.SelectCommand = "SELECT 'test1', 'test2', 'test3'";
this.gridTest.DataSourceID = "dsTest";
this.gridTest.DataBind();

2 ページ目も同じですが、グリッドのデータが異なります。

結果として、両方のアラートが同時に発生しますが、グリッドは 1 つずつロードされます。つまり、最初のグリッドが 5 秒後に表示され、次に 2 番目のグリッドがさらに 5 秒後に表示されます。つまり、サーバーは実際にはそれらを同時に処理しません。

何が間違っているのか、必要に応じてすべてを整理するにはどうすればよいですか?

4

1 に答える 1

4

これは、セッションがページの読み取りをロックするために発生します。
そのため、1 つのページが読み込まれると、セッションは終了するまで残りのすべてのリクエストをロックし、ページを送信します。

これを機能させるには、このページでセッションを無効にする必要があります。デフォルトではセッション ロックが設定されていないハンドラーを使用します。

関連する質問 :

Web メソッドを非同期にしようとしている
同じセッションを共有している別の Web アプリを処理しているときに Web アプリがブロックされた
ASP.NET のボトルネックを特定するのに役立つ perfmon カウンターは何ですか?
ASP.Net のセッションを完全に置き換える

于 2012-09-05T15:46:10.010 に答える