我正在尝试找到一种在webforms页面的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?
答案 0 :(得分:3)
页面中的所有服务器端代码(无论是否异步)都将执行,然后才会将结果呈现为HTML并发送到客户端。所以对于客户来说,你所做的事情并没有帮助。
相反,您要关注的是首先将初始内容提供给客户端,然后使用AJAX向服务器发出后续请求。理想情况下,这意味着您在Page_Load或可能在初始请求上运行的任何其他方法中尽可能少。
与Joe不同,我不建议使用UpdatePanel,因为这将为您带来更多的麻烦。相反,学会使用较低的AJAX抽象,例如jQuery AJAX,Zepto.js AJAX或Angular's HTTP service。要让服务器响应这些请求,请实施ASP.NET Web API或HTTP handlers。
您会发现Single Page Applications中使用的许多技巧都很方便,但您无需使用完整的SPA来实现目标。
答案 1 :(得分:0)
如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>