asp.net - page - mvc async operations
ASP.NET Server no procesa las páginas de forma asincrónica (1)
Tengo una página con el botón y quiero cargar 2 cuadrículas de datos con datos de forma asincrónica pulsando el botón.
Este es el código de la página, yo uso jquery para hacer llamadas a otras 2 páginas que me darán 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>
Luego tengo 2 páginas aspx, Source1.aspx y Source2.aspx. Solo contienen un gridDataView y un pequeño código en el evento 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>
Lado del servidor:
Thread.Sleep(5000);
dsTest.SelectCommand = "SELECT ''test1'', ''test2'', ''test3''";
this.gridTest.DataSourceID = "dsTest";
this.gridTest.DataBind();
Y lo mismo para la segunda página, pero con diferentes datos para la grilla.
Lo que tengo como resultado es que ambas alertas suceden a la vez, pero las cuadrículas se cargan una tras otra, es decir, la primera cuadrícula aparece después de 5 segundos, y luego la segunda aparece después de otros 5 segundos. Ese es el servidor en realidad no los procesa al mismo tiempo.
¿Qué estoy haciendo mal y cómo debería organizar todo para que funcione como lo necesito?
Esto sucede porque la sesión bloquea las lecturas de la página.
Por lo tanto, cuando la página se está cargando, la sesión bloquea todas las demás solicitudes hasta que finaliza y envía la página.
Para hacer que funcione necesitas ether para deshabilitar la sesión en estas páginas, ether use handler que no tiene por bloqueo de sesión predeterminado.
Preguntas relativas
Intentando hacer que el método web sea asíncrono
Aplicación web bloqueada al procesar otra aplicación web al compartir la misma sesión
¿Qué contadores de perfmon son útiles para identificar los cuellos de botella de ASP.NET?
Reemplazando completamente la sesión de ASP.Net