2009-11-24 64 views
2

我遇到了一个相当棘手的情况,我希望你们都可以提供帮助。作为我的应用程序的一部分,我为我的用户生成一个文件。不幸的是,生成这个文件的时间可能接近5分钟。为了安抚我的用户,我正在显示一条消息,请他们请等待。一旦我生成了文件,我想将文件返回给他们并清除该消息。我正在使用ASP.NET计时器来检查文件何时完成生成。如何在生成文件后关闭启动消息?

一旦文件完成生成,我的问题就来了。在这一点上,我需要做三件事:

  1. 将文件传递给用户。
  2. 关闭该消息。
  3. 禁用定时器。

我的问题来自于一个事实,一旦我写完的文件的响应,我回发没有完成,所以视图状态没有更新,因此消息和定时器仍然那里。

任何想法?

+0

嗯。大量的投票和没有评论。如果没有任何关于为什么他们不是很好的答案的背景,那么投票答案就不会太多。 – 2009-11-24 21:00:00

+0

错,我还没有投票给任何人。 – 2009-11-24 21:18:44

+0

对不起 - 没有说你(科雷尔)低估了 - 这是对downvoters的一般评论。 – 2009-11-24 21:56:30

回答

1

我认为你需要将其分解为几个阶段,而不是在单个页面请求中完成所有处理。如果我正在设计这个,我会去做这样的事情..

  1. 用户通过点击您网站上的某个链接来启动创建文件。这会将一些信息写入数据库表,或以其他方式启动生成该文件的进程。
  2. 用户会看到一个“please wait”页面,该页面可以每N秒更新一次。
  3. 生成文件时,数据库表的状态为“就绪”。
  4. “请稍候”页面刷新后,作业被视为完成,现在下载文件。

假设“请稍候”页面使用基于身份验证的用户一些标识那么这具有允许用户收集其文件的利益,无论他们是否感到厌倦和/或意外关闭浏览器。

其实,为什么不签出覆盖地面类似这些所谓的帖子...

Handling Long Running Reports Long-running code within asp.net process BackgroundWorker thread in ASP.NET

...并有其他人(搜索“ASP.NET长期运行“)

+0

这是我过去的做法。最难的一点是让你长时间运行的进程在页面请求线程之外运行。但一旦你做到了这一点,它是一个好方法。 – Chris 2009-11-24 22:40:04

-1

我做了类似的事情,但没有使用计时器。基本上,我启动一个对话框OnClientClick,然后让服务器端的事情(OnClick)。我用下面的JavaScript来处理回发在返回的OnClientClick:

Dialog.show();  
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
        function(sender, args) {        
         MyDialog.hide(); 
        }); 
+0

反对的任何特定原因? – 2009-11-24 21:20:15

-1

吻方法重定向到一个载入页面(与加载信息等),后者又调用加载速度慢的资源。页面消失,显示加载消息,直到资源准备就绪。唯一的缺点是,如果您的资源确实需要5分钟才能生成,请求将超时。如果是这种情况,@ Martin-Peck已经发布了更好的解决方案。

相关问题