我正在使用 ASP.NET 和 C# 并将一个非常大的结果集导出到 Excel。当我的导出代码正在运行时,我想显示一个“加载”动画 gif,以便用户知道他们的请求正在处理中。我一直在尝试用多线程来做到这一点,但我对它不是很熟悉。谁能指导我正确的方向?谢谢!
乔恩
我正在使用 ASP.NET 和 C# 并将一个非常大的结果集导出到 Excel。当我的导出代码正在运行时,我想显示一个“加载”动画 gif,以便用户知道他们的请求正在处理中。我一直在尝试用多线程来做到这一点,但我对它不是很熟悉。谁能指导我正确的方向?谢谢!
乔恩
你想在服务器上做多线程吗?我建议在您的客户端 javascript 中打开请等待消息,然后再发布到服务器。然后在客户端,当您完成发布后,您会关闭消息。
在不了解您的实际设置的情况下,我无能为力,但上次我实现这一点时,我做了以下事情:
假设我们有一个使用 JQUERY 的名为 PrintLoadingPanel 的 div,我将 div 设置为显示并接管窗口:
$("#printLoadingPanel")
.css({display:"block",top:"0px",left:"0px",height:screen.availHeight});
然后我将启动一个以 1/2 秒为间隔的计时器,它将开始检查我们是否完成了打印。我只生成和下载小型 PDF,所以我需要更快的响应。如果您的报告真的很慢,您可能需要调整一下:
window.setTimeout(checkIfDoneDownload,500);
然后我的 CheckIfDoneDownload 函数访问服务器并检查我们是否完成了文件的生成并下载了它。我在这里再次使用 JQUERY 来调用启用 AJAX 的 WCF 服务。您可以将其替换为 PageMethods 或任何其他回调到服务器的方式。
function checkIfDoneDownload()
{
$.ajax({
type: "POST",
url: "../Services/Utilities.svc/IsPrintDownloadDone",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
if (msg.d)
{
$("#printLoadingPanel").css("display","none");
}
else {window.setTimeout(checkIfDoneDownload,500);}
},
error: function (xhr, textStatus, errorThrown) {
if (xhr.status==12030) {checkIfDoneDownload();}
}
});
}
现在在服务器端,我正在通过 HTTP 处理程序生成我的下载。本质上,它所做的第一件事是将会话级别标志设置为 false,然后它所做的最后一件事是将其设置回 true。我的检查是否完成服务只返回标志的值。
我在生成报告时遇到了同样的问题。一个简单的解决方案是在晚上运行报告,然后将其写入服务器。然后提供指向报告的链接。
如果您能够使用 ASP.NET AJAX,那么我建议您使用该UpdateProgress
控件(连同UpdatePanel
.
如果您想要一个漂亮的动画 gif 图像,请查看Ajaxload。