首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不阻塞页面加载的PageAsyncTask

问不阻塞页面加载的PageAsyncTask
EN

Stack Overflow用户
提问于 2015-07-28 13:33:59
回答 2查看 2.5K关注 0票数 0

我正在设法在webforms页面的Page_Load方法中执行异步方法,而不阻塞用户的页面加载。我使用的代码如下:

C#代码在中的应用

代码语言:javascript
复制
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视图

代码语言:javascript
复制
<%@ 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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-28 14:03:08

正如法尔斯所指出的,这可以通过UpdatePanel来实现。

C#代码在中的应用

代码语言:javascript
复制
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视图

代码语言:javascript
复制
<%@ 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>
票数 0
EN

Stack Overflow用户

发布于 2015-07-28 14:08:27

您页面中的所有服务器端代码,无论是否异步,都将执行,只有这样,结果才会呈现到HTML中并发送到客户端。所以对客户来说,你所做的毫无帮助。

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

与Joe不同的是,我不建议使用UpdatePanel,因为这会给您带来更多的麻烦。相反,学习使用较低的AJAX抽象,例如jQuery AJAX、Zepto.js AJAX或角的HTTP服务。要使服务器响应这些请求,请实现ASP.NET网络API或HTTP处理程序。

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

​

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31677875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档