这是我采用较长运行进程以避免阻塞 UI 线程并向用户提供视觉反馈的方法的一个示例。
我将使用生成报告示例进行演示,这需要 .net 4.5。
围绕返回任务的报告生成处理创建一个方法。
作为一个例子,请看下面:
private Task RunReport()
{
return Task.Run(() =>
// The below should contain your generate report code
Thread.Sleep(5000)
);
}
然后让你的Action
回报成为一个任务,并await
在调用报告之前放一个。
这将解锁 UI 线程,允许用户在生成报告时继续使用该站点。内容是完成处理后将返回到页面的内容。
[HttpPost]
public async Task<ActionResult> RequestReportGen()
{
await RunReport();
// Add your link to the report in the content below
return Content("Report generated!";
}
包括以下 javascript 库:
<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
然后使用 ajax 表单发布到您的方法,请注意LoadingElementId
(等待时显示)和UpdatedTargetId
(显示完成的消息)。
@using (Ajax.BeginForm("RequestReportGen", "Home", new AjaxOptions { UpdateTargetId = "result", LoadingElementId="loading" }))
{
<div id="loading" style="display:none;">Generating Report...</div>
<div id="result"></div>
<input type="submit" />
}
使用上述方法,您的用户仍然可以使用该站点,因为您的 UI 线程不会被阻止,并且消息会在加载和完成时转发回用户。