在ASP.Net Web应用程序中存储进度信息的位置

时间:2011-07-21 04:45:12

标签: c# asp.net webforms

我正在创建一个页面,用于获取上传的文本文件并将其构建为多个PDF文件。它们只是Excel的导出。文件中的每一行对应一个需要创建的新PDF。

无论如何,一旦文件被上传,我想开始处理它们,但我不希望用户必须留在页面上,或者甚至仍然打开会话。例如,他们可以关闭浏览器并在10分钟后返回,登录,并且进度信息会说112/200文件被处理或者某些东西。它会比这快得多。

真的有两个问题,我怎样才能将这个处理作业传递给某个(Handler?Thread?),它会在页面关闭时继续运行,并在作业开始后立即返回(所以浏览器不是'停了)?其次,我可以在哪里存储这些信息,以便当用户返回页面时,他们可以看到当前的进度。

我意识到我无法使用会话,并且因为它将在一秒钟内处理一个文件,所以 有什么方法可以做到这一点吗?有可能吗?

1 个答案:

答案 0 :(得分:-1)

我通过使用上面的旁观者提供的链接解决了这个问题。我只是在HttpContext.Application中创建一个对象来存储进度变量,然后设置在新线程中进行处理的方法。

// Create the new progress object
BatchProgress bs = new BatchProgress(0);
if(Application["BatchProgress"] != null)
{
    // Should never happen
    Application["BatchProgress"] = bs;
}
else
{
    Application.Add("BatchProgress","bs");
}

//Set up new thread, run batch is the method that does all the processing.
ThreadStart ts = new ThreadStart(RunBatch);
Thread t = new Thread(ts);
t.Start();

然后在线程启动后返回,我可以使用jQuery定期获取Application [“BatchProgress”]对象。在我的线程结束时,BatchProgress对象的状态设置为“Complete”,然后当jQuery查询它时,它会看到完整状态并从应用程序中删除进度对象。