0

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

4

2 回答 2

3

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

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

与 Joe 不同,我不建议使用 UpdatePanel,因为这会给您带来很多麻烦。相反,学习使用 AJAX 的较低抽象,例如jQuery AJAXZepto.js AJAXAngular 的 HTTP 服务。要让服务器响应这些请求,请实现ASP.NET Web APIHTTP 处理程序

您会发现单页应用程序中使用的许多技术都很方便,但您不必完全使用 SPA 来实现您的目标。 SPA图

于 2015-07-28T14:08:27.807 回答
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>
于 2015-07-28T14:03:08.360 回答