我使用Delphi开发了一个程序,在某些功能中,它会对浮点值进行大量数据库读取,并对这些值进行大量计算。在这些计算结束时,它会显示一个包含一些结果的屏幕。这些计算需要一些时间才能完成:今天,最终显示结果屏幕之前的5到10分钟。
现在,我的客户正在请求此程序的.Net版本,因为几乎所有其他程序都已经转到.Net。但是我担心这个耗时的计算过程不适合Web场景,程序会让用户遇到某种超时错误。
所以,我想要了解如何进行此类程序的一些提示或建议。最初我考虑过调用本地可执行文件(甚至可能是我最初的Delphi程序,以控制台方式),并在一段时间后在网页中显示结果屏幕。但是,再次,我担心这不是最好的方法。
答案 0 :(得分:4)
外部流程是一种合理的方式。您可以在ASP.NET进程内部启动一个线程(即只使用new Thread()
),这也可以工作,但是在进程回收和池化方面存在一些问题,这可能会使这个问题变得更加困难。简单地触发一个外部进程然后使用一些Ajax轮询来检查它在浏览器上的状态似乎是一个很好的解决方案。
答案 1 :(得分:3)
FWIW,一些现有在线服务使用的另一种模式(例如,可能需要几分钟进行文件转换的模式)是将该人放入电子邮件地址,并在完成后通过电子邮件发送结果 - 如果他们不小心杀死了他们的浏览器,或者它需要的时间比预期的要长一些,那么这没什么大不了的。
我过去采用的另一种方法基本上就是Dean所建议的 - 启动它并创建一个自动刷新的状态页面,一旦完成,状态就会包含指向结果的链接。
答案 2 :(得分:0)
怎么样:
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服务器仍然可以使请求在服务器端超时。
您还可以更新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分钟才能获得结果。