关于C#中耗时过程的建议

时间:2010-08-26 04:22:24

标签: c# asp.net performance

我使用Delphi开发了一个程序,在某些功能中,它会对浮点值进行大量数据库读取,并对这些值进行大量计算。在这些计算结束时,它会显示一个包含一些结果的屏幕。这些计算需要一些时间才能完成:今天,最终显示结果屏幕之前的5到10分钟。

现在,我的客户正在请求此程序的.Net版本,因为几乎所有其他程序都已经转到.Net。但是我担心这个耗时的计算过程不适合Web场景,程序会让用户遇到某种超时错误。

所以,我想要了解如何进行此类程序的一些提示或建议。最初我考虑过调用本地可执行文件(甚至可能是我最初的Delphi程序,以控制台方式),并在一段时间后在网页中显示结果屏幕。但是,再次,我担心这不是最好的方法。

4 个答案:

答案 0 :(得分:4)

外部流程是一种合理的方式。您可以在ASP.NET进程内部启动一个线程(即只使用new Thread()),这也可以工作,但是在进程回收和池化方面存在一些问题,这可能会使这个问题变得更加困难。简单地触发一个外部进程然后使用一些Ajax轮询来检查它在浏览器上的状态似乎是一个很好的解决方案。

答案 1 :(得分:3)

FWIW,一些现有在线服务使用的另一种模式(例如,可能需要几分钟进行文件转换的模式)是将该人放入电子邮件地址,并在完成后通过电子邮件发送结果 - 如果他们不小心杀死了他们的浏览器,或者它需要的时间比预期的要长一些,那么这没什么大不了的。

我过去采用的另一种方法基本上就是Dean所建议的 - 启动它并创建一个自动刷新的状态页面,一旦完成,状态就会包含指向结果的链接。

答案 2 :(得分:0)

怎么样:

  • 创建一个执行提取/计算的Web服务。
  • 设置timeout以使其不会过期。

YourService.HeavyDutyCalculator svc = new YourService.HeavyDutyCalculator(); svc.Timeout = 10 * 1 * 1000; //Constitutes 10 mins, 10 mins x 1 second x 1000 ms Service.CalculateResult result = svc.Calculate();

请注意,如果您希望无限运行,可以输入-1。

MSDN

  

将Timeout属性设置为Timeout.Infinite表示请求没有超时。即使XML Web服务客户端可以将Timeout属性设置为不超时,Web服务器仍然可以使请求在服务器端超时。

  • 在您的网页中调用该网络方法
  • 放置一个等待/进入的图像
  • 注册网络方法OnComplete事件;并在完成后显示结果。

您还可以更新web.config中的超时:

<httpRuntime useFullyQualifiedRedirectUrl="true|false"
             maxRequestLength="size in kbytes"
             executionTimeout="seconds"
             minFreeThreads="number of threads"
             minFreeLocalRequestFreeThreads="number of threads"
             appRequestQueueLimit="number of requests"
             versionHeader="version string"/>

答案 3 :(得分:0)

无论您做什么,您都需要向用户显示进度条或其他状态指示。用户习惯于在几秒钟内加载的网页,他们根本不会意识到(即使你提前告诉他们)他们必须等待整整10分钟才能获得结果。