0

我正在使用 ASP.NET 和 C# 并将一个非常大的结果集导出到 Excel。当我的导出代码正在运行时,我想显示一个“加载”动画 gif,以便用户知道他们的请求正在处理中。我一直在尝试用多线程来做到这一点,但我对它不是很熟悉。谁能指导我正确的方向?谢谢!

乔恩

4

3 回答 3

1

你想在服务器上做多线程吗?我建议在您的客户端 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。我的检查是否完成服务只返回标志的值。

于 2009-02-06T16:42:02.567 回答
0

我在生成报告时遇到了同样的问题。一个简单的解决方案是在晚上运行报告,然后将其写入服务器。然后提供指向报告的链接。

于 2009-02-06T16:37:22.717 回答
0

如果您能够使用 ASP.NET AJAX,那么我建议您使用该UpdateProgress控件(连同UpdatePanel.

如果您想要一个漂亮的动画 gif 图像,请查看Ajaxload

于 2009-02-06T17:18:15.580 回答