不阻塞页面加载的 PageAsyncTask
PageAsyncTask without blocking page load
我正在尝试寻找一种方法来在 Web 表单页面的 Page_Load 方法中执行异步方法,而不阻塞用户的页面加载。我正在使用以下代码:-
C# 代码隐藏
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(AsyncDatabind));
}
private async Task AsyncDatabind()
{
await Task.Delay(5000);
Test.Text = "Hello!";
}
}
ASPX 视图
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AsyncTest._Default" Async="true"%>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:Label ID="Test" runat="server"></asp:Label>
</asp:Content>
理想情况下,页面应该为用户加载,然后在异步任务完成后更新标签。因此,在设置标签文本之前,页面应该可见 5 秒。这可能使用 PageAsyncTask 吗?
如 Fals 所述,这可以通过 UpdatePanel 实现。
C# 代码隐藏
public partial class _Default : Page
{
public bool Loaded { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
}
private async Task AsyncDatabind()
{
await Task.Delay(5000);
Test.Text = "Hello!";
Loaded = true;
}
protected void Panel_Load(object sender, EventArgs e)
{
if(IsPostBack && !Loaded)
RegisterAsyncTask(new PageAsyncTask(AsyncDatabind));
}
}
ASPX 视图
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AsyncTest._Default" Async="true"%>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel ID="Panel" ClientIDMode="AutoID" runat="server" OnLoad="Panel_Load">
<ContentTemplate>
<asp:Label ID="Test" runat="server"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<script>
<%if(!Loaded){%> $(document).ready(function () { __doPostBack('Panel', ''); }); <%}%>
</script>
</asp:Content>
您页面中的所有服务器端代码,无论是否异步,都将执行,然后结果才会呈现给 HTML 并发送给客户端。所以对于客户来说,你所做的没有任何帮助。
相反,您要关注的是首先将初始内容获取到客户端,然后使用 AJAX 向服务器发出后续请求。理想情况下,这意味着您的 Page_Load 或任何其他可能 运行 初始请求的方法尽可能少。
与 Joe 不同,我不建议使用 UpdatePanel,因为这会给您带来很多麻烦。相反,学习使用 AJAX 的较低抽象,例如 jQuery AJAX, Zepto.js AJAX, or Angular's HTTP service. For the server to respond to these requests, implement ASP.NET Web API or HTTP handlers.
您会发现 Single Page Applications 中使用的许多技术都会派上用场,但您不必完全使用 SPA 来实现您的目标。
我正在尝试寻找一种方法来在 Web 表单页面的 Page_Load 方法中执行异步方法,而不阻塞用户的页面加载。我正在使用以下代码:-
C# 代码隐藏
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(AsyncDatabind));
}
private async Task AsyncDatabind()
{
await Task.Delay(5000);
Test.Text = "Hello!";
}
}
ASPX 视图
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AsyncTest._Default" Async="true"%>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:Label ID="Test" runat="server"></asp:Label>
</asp:Content>
理想情况下,页面应该为用户加载,然后在异步任务完成后更新标签。因此,在设置标签文本之前,页面应该可见 5 秒。这可能使用 PageAsyncTask 吗?
如 Fals 所述,这可以通过 UpdatePanel 实现。
C# 代码隐藏
public partial class _Default : Page
{
public bool Loaded { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
}
private async Task AsyncDatabind()
{
await Task.Delay(5000);
Test.Text = "Hello!";
Loaded = true;
}
protected void Panel_Load(object sender, EventArgs e)
{
if(IsPostBack && !Loaded)
RegisterAsyncTask(new PageAsyncTask(AsyncDatabind));
}
}
ASPX 视图
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AsyncTest._Default" Async="true"%>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel ID="Panel" ClientIDMode="AutoID" runat="server" OnLoad="Panel_Load">
<ContentTemplate>
<asp:Label ID="Test" runat="server"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<script>
<%if(!Loaded){%> $(document).ready(function () { __doPostBack('Panel', ''); }); <%}%>
</script>
</asp:Content>
您页面中的所有服务器端代码,无论是否异步,都将执行,然后结果才会呈现给 HTML 并发送给客户端。所以对于客户来说,你所做的没有任何帮助。
相反,您要关注的是首先将初始内容获取到客户端,然后使用 AJAX 向服务器发出后续请求。理想情况下,这意味着您的 Page_Load 或任何其他可能 运行 初始请求的方法尽可能少。
与 Joe 不同,我不建议使用 UpdatePanel,因为这会给您带来很多麻烦。相反,学习使用 AJAX 的较低抽象,例如 jQuery AJAX, Zepto.js AJAX, or Angular's HTTP service. For the server to respond to these requests, implement ASP.NET Web API or HTTP handlers.
您会发现 Single Page Applications 中使用的许多技术都会派上用场,但您不必完全使用 SPA 来实现您的目标。