PageAsyncTask不会阻止页面加载

时间:2015-07-28 13:34:00

标签: c# asp.net webforms async-await pageasynctask

我正在尝试找到一种在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?

2 个答案:

答案 0 :(得分:3)

页面中的所有服务器端代码(无论是否异步)都将执行,然后才会将结果呈现为HTML并发送到客户端。所以对于客户来说,你所做的事情并没有帮助。

相反,您要关注的是首先将初始内容提供给客户端,然后使用AJAX向服务器发出后续请求。理想情况下,这意味着您在Page_Load或可能在初始请求上运行的任何其他方法中尽可能少。

与Joe不同,我不建议使用UpdatePanel,因为这将为您带来更多的麻烦。相反,学会使用较低的AJAX抽象,例如jQuery AJAXZepto.js AJAXAngular's HTTP service。要让服务器响应这些请求,请实施ASP.NET Web APIHTTP handlers

您会发现Single Page Applications中使用的许多技巧都很方便,但您无需使用完整的SPA来实现目标。 SPA diagram

答案 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>