使用长时间运行的方法阻止 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 的请求被长时间运行的控制器代码阻止?