使用长时间运行的方法阻止 ASP.NET Web 窗体中的网页

Posted

技术标签:

【中文标题】使用长时间运行的方法阻止 ASP.NET Web 窗体中的网页【英文标题】:Blocking web page in ASP.NET Web Forms with long running method 【发布时间】:2015-06-15 11:23:13 【问题描述】:

我想在我的 GridView 中显示一个数据库结果,但是当调用一个长时间运行的方法时网页非常慢。

在 GridView 中,我有一个带有以下项目模板的模板字段:

<ItemTemplate>  
        <asp:Label ID="lblNumResults" runat="server" Text='<%# GetNumCrawlResults(Convert.ToInt32(Eval("id"))) %>'></asp:Label>
</ItemTemplate>

这是对应的方法:

public string GetNumCrawlResults(int jobId)

    var task = Task.Run(() => Utilities.GetNumCrawlResults(jobId));
    //this is slow and blocks the GUI
    return Convert.ToString(task.Result);

这是数据库查询:

public static async Task<int> GetNumCrawlResults(int jobId)

    DocumentCollection collection = await GetOrCreateCollectionAsync(database.SelfLink, Convert.ToString(jobId));

    var result = (from c in documentDb.CreateDocumentQuery<Shared.CrawlResult>(collection.SelfLink)
                  select c).AsEnumerable();
    return result.Count();

有什么方法可以在异步方法完成后分配标签文本?

谢谢

【问题讨论】:

慢有多慢?无论如何,对于异步方法的使用需要使用await 语法。对于 Web 表单,您需要将页面标记为异步并使用 RegisterAsyncTask,如 here 所述。 您是否无法将此计数作为初始查询的一部分? DataBinding 仍处于迭代事件中,在每次迭代时调用长时间运行的函数是个坏主意。 @mason 谢谢。我做了一个小例子pastebin.com/Mw5rHN6P,但它仍然阻止网站加载 5 秒。我正在使用 .net 4.5 让我们弄清楚这一点:在后面的代码中运行的任何代码都会阻止页面加载,无论您是否使用异步。这就是 ASP.NET 模型的工作原理:它只向下发送一次响应,因此所有代码都阻塞了响应。如果您想先发送页面的 html,然后再发送数据,那么您应该改用客户端上的 AJAX 来加载信息。 【参考方案1】:

您的页面呈现结果了吗?我的印象是缺少 task.wait() 语句。

无论如何,在你的情况下,我会使用 Ajax 和 Knockout(或类似的)。

【讨论】:

以上是关于使用长时间运行的方法阻止 ASP.NET Web 窗体中的网页的主要内容,如果未能解决你的问题,请参考以下文章

长时间运行的 ASP.NET MVC 核心控制器 HTTPPost 方法超时

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

为啥我对 web.api 的请求被长时间运行的控制器代码阻止?

asp.net 页面在服务器上需要很长时间的加载时间

如何使用javascript在asp.net上停止正在进行的回发(长时间运行)?

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?