处理ASP.NET中的长页面执行时间

时间:2009-02-23 23:35:35

标签: c# asp.net performance asp.net-3.5

我正在开发一个Web应用程序导入程序。目前,管理员用户可以上传我的页面将解析的格式化的csv文件。我遇到执行持续时间问题,因为每行都属于必须保存到Scribd,S3的文件,以及一些内部处理。

你们会建议什么来改善执行时间?由于这是一个仅限管理员的页面,我怀疑它每周会运行多次,所以我希望尽快把它推出门。

我看了一下Async =“true”标志,但我不确定这是否是我想去的方向,或者我是否应该看一下Windows服务器。

6 个答案:

答案 0 :(得分:1)

有两种选择:

线程:在代码设置中创建一组线程,加入它们,然后让每个线程处理一个文件。完成所有线程后,您将能够返回页面。这会增加你的回合时间,但仍然可以在页面返回上留下一些需要

队列:让用户提交csv文件并提供GUID / Hash / Whatever ID,然后管理员可以转到“状态”页面,输入他们的ID并查看他们的详细信息工作。该解决方案将为用户提供快速反馈,并允许他们跟踪结果,而无需等待。

答案 1 :(得分:0)

快速而脏的选项可能是将Page.Server.ScriptTimeout设置为该页面上的非常高的值。 (我认为它在Int.MaxValue上达到最大值)。

可能建议在点击后阻止提交按钮,并告知用户他们可能想要去煮咖啡。

答案 2 :(得分:0)

我建议使用AJAX进行内部回发,以处理异步处理。您可以定期轮询状态,并防止您的母版页在页面上持续搅动“处理”轮以进行漫长的过程。

答案 3 :(得分:0)

我有一个网页,需要很长时间来处理邮件列表,所以我在它自己的线程中启动它。完成此过程后,可以从结果页面上的另一个链接查看报告。我有一个可运行的MailSender类。 ASPX脚本中有一点如下:

// prep the MailSender
MailSender ms = new MailSender(people, Subject, FileName....);                       
if (SendAsync) {
    ThreadStart ts = new ThreadStart(ms.run);
    Thread WorkerThread = new Thread(ts);
    WorkerThread.Start();
} else {
    ms.run();
}

如果你想加速你的代码,如果可以的话,尝试将它分解为可并行化的部分,并为每个部分编写一个类。然后,您可以为每个位启动一个新线程,并在某处监视状态,以便通知用户何时返回结果。你说输入的每一行都会产生它自己的输出文件。听起来像是一个很好的多线程候选者。如果您的服务器上没有多核可用,则不会加快速度。

整个方案的一个问题是服务器重启或应用程序池回收会终止您长时间运行的进程。如果您的线程要运行一两个小时,这可能会出现问题。

答案 4 :(得分:0)

由于外部因素涉及处理时间,您需要考虑性能改进是否会影响“实际”性能,如果大部分时间处理它并将其发送给第三方(即Scribd,S3),那么在你的最终做出改进可能不会产生巨大影响,并可能增加简单任务的复杂性。

我要做的是让aspx页面只做aspx做得最好;即仅处理用户界面部分(即上传),因此一旦上传完成,就用户而言,他们的部分就完成了。您可以使用AJAX实现进度指示器,使其更好,但作为一个管理部分,我不打扰细节,

然后让一个简单的控制台应用程序以特定的时间间隔进行激活,或者一个Windows服务监视目录(取决于更新的时间关键),一旦应用程序在后台运行并且不需要用户交互,时间不是一个关键因素(即你没有用户等待返回上下文)..

对用户来说,事情是非常敏捷的(即上传文件所需的时间),并且你的解决方案仍然存在不必要的复杂性。

答案 5 :(得分:0)

我认为你想要的最简单的解决方案是在ASP.NET中使用异步页面。你有什么特别的理由不想走这条路吗?

我可以想到一个替代方案,即具有一些后台进程(如Windows中的计划任务或Windows服务触发的进程),它将查看等待作业的队列(例如,从数据库表中查找)并处理这些工作。这样,您必须在某处上传该CSV并插入数据库记录,以便后台进程将看到该CSV并在其出现时使用它。但对我来说似乎更多的工作,所以我宁愿使用异步页面:)

这是一个不错的tutorial on ASP.NET asynchronous pages