ASP.NET 服务器不异步处理页面

Posted

技术标签:

【中文标题】ASP.NET 服务器不异步处理页面【英文标题】:ASP.NET Server does not process pages asynchronously 【发布时间】:2012-08-30 08:31:51 【问题描述】:

我有一个带按钮的页面,我想通过单击按钮异步加载 2 个数据网格。

这是页面的代码,我使用 jquery 调用其他 2 个页面,这将产生我的 html

<%@ 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>

然后我有 2 个 aspx 页面,Source1.aspx 和 Source2.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();

第二页也一样,但网格的数据不同。

我得到的结果是两个警报同时发生,但是网格一个接一个地加载,即第一个网格在 5 秒后出现,然后第二个网格在 5 秒后出现。 那就是服务器实际上并没有同时处理它们。

我做错了什么,我应该如何组织所有人按我的需要工作?

【问题讨论】:

【参考方案1】:

这是因为会话锁定了页面读取。 因此,当一个页面正在加载时,会话会锁定所有其余请求,直到完成并发送页面。

要使其正常工作,您需要 ether 禁用此页面上的会话,ether 使用默认情况下没有会话锁定的处理程序。

相关问题:

Trying to make Web Method AsynchronousWeb app blocked while processing another web app on sharing same sessionWhat perfmon counters are useful for identifying ASP.NET bottlenecks?Replacing ASP.Net's session entirely

【讨论】:

“页面加载”是什么意思?我没有加载页面,但是做了ajax请求 @VitaliiKorsakov ajax 请求是在客户端异步加载页面。你仍然加载一个页面——我所说的是在服务器上处理的——而不是在客户端浏览器上。由于会话锁定,服务器上的处理被阻止。 @VitaliiKorsakov 禁用此页面的会话,您会看到它按预期工作。

以上是关于ASP.NET 服务器不异步处理页面的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 异步/等待第 2 部分

线程静态、ASP.NET 和异步处理程序

ASP.NET WebForm 之 Ajax 请求后端处理

使用 twilio 来自 asp.net 的异步 SMS

ASP.NET里面Ajax请求数据后台可以用多线程处理返回吗?

ASP.NET MVC中使用异步控制器