ASP.Net异步阻止UI

时间:2015-11-13 17:36:08

标签: asp.net webforms async-await asp.net-ajax

我有一个ASP.Net Web窗体应用程序,它通过Ajax Update面板中的按钮单击事件调用IIS上托管的WCF服务。 当我单击按钮时,我调用WCF异步过程,可能需要1分钟才能返回。我注意到任务正在运行时,我在浏览器中打开另一个选项卡,网页冻结/时钟,直到长时间运行的任务返回。我假设第一个任务是锁定UI线程,导致其他人使用该网页必须等待。

如何运行任务,使用结果更新UI而不阻止其他标签/用户的UI?

以下是代码片段:

 protected void btnsearch_ServerClick(object sender, EventArgs e)
    {

        Page.RegisterAsyncTask(new PageAsyncTask(async () =>
        {
            DataSet ds;
            ds = await data.GetReportAsync();

            grdsummary.DataSource = ds.Tables[0];
            grdsummary.DataBind();
        }));

    }

我确实尝试将.ConfigureAwait(false)添加到Async调用但没有做任何事情。

2 个答案:

答案 0 :(得分:2)

  

我假设第一个任务是锁定UI线程,导致其他人使用该网页必须等待。

这是ASP.NET;没有UI线程。

最有可能的是,session state阻止了多个同时发出的请求。

请注意,多个用户不会受到影响;只有同一会话中的多个请求才会被手工化。

答案 1 :(得分:0)

注册是一回事,执行是彼此:)

之后只需添加一个ExecuteRegisteredAsyncTasks调用,它应该可以正常工作,或者请在完成此调用的地方添加代码。

protected void btnSearch_Click(object sender, EventArgs e)
{
    Page.RegisterAsyncTask(new PageAsyncTask(async () =>
    {
        grdsummary.DataSource = await getSomeDataAsync();
        grdsummary.DataBind();
    }));
    Page.ExecuteRegisteredAsyncTasks();
}