2

我有一个从经典 asp 页面调用的长时间运行的 vb6 Com 对象

当没有太多事情可做时,它可以完美运行,但如果必须做很多事情,它就会超时。

有没有办法调用它异步所以它不会超时或

我可以调用一个进度条来继续刷新客户端,这样它就不会超时?

Set objQReport = Server.CreateObject("ReportGenerator")

mainRpt = objQReport.GenerateReport(MySessionRef) ' times out here sometimes

Set objQReport = nothing

任何提示都会有所帮助

4

1 回答 1

2

Web 技术并不真正适合长时间运行的任务,但您有多种选择:

一种选择是对第二个 ASP 页面进行 AJAX 调用。只要您运行 ASP,服务器就会完成该过程,即使客户端(进行实际调用的浏览器/AJAX)不再连接。

这种方法确实使用 Web 技术来处理一个长时间运行的任务,缺点是执行这个长时间运行的任务会加重 IIS 机器的负担,从而降低 IIS 擅长的性能;服务网页。

因此,在您的登录页面(例如 default.asp)中,对您的(长期运行的)报告页面进行 AJAX 调用。如何进行 ajax 调用取决于您使用的(如果有的话)javascript 库。在 Jquery 中会是这样的:

    <script type="text/javascript">
    /* AJAX call to start the report generation */
     $(document).ready(function(){
            $.get("[URL_OF_YOUR_LONG_RUNNING_PROCESS]", function(data) 
                {
                    alert(data);
                });
     });
    </script>

如您所见,我正在警告从此 URL 返回的任何数据,但在您的情况下,这可能不是您想要的。您希望您的访问者在长期运行的过程继续工作时继续浏览。

这样,URL 被异步调用。服务器将开始处理 URL,浏览器无需等待。服务器将继续并在后台完成长时间运行的任务。

请注意,您仍然需要在运行长进程的 asp 页面上增加 server.scripttimeout。这只是确保用户可以继续浏览,服务器仍然会尊重配置的 server.scripttimeout 设置,如果时间过长则会失败。

广泛使用的第二种选择是使用消息队列。消息队列接受消息并保证这些消息的传递,即使计算机或网络出现故障也是如此。

Microsoft Windows 内置了 MSMQ(您必须在软件设置中启用它),您可以在经典 ASP 中使用它。队列将存储消息并将它们传递给消费者。消费者是你需要自己写的东西;一个可以读取队列并处理内部消息的应用程序。

您所做的是让 ASP 向 MSMQ 写入一条消息,其中包含有关要执行的任务及其参数的信息。
您的消费者应用程序必须轮询 MSMQ、读取消息并启动长时间运行的进程。这将完全独立于 IIS 运行,甚至可以在完全不同的计算机上运行(MSMQ 可以跨网络运行)。

第二种方法的缺点是您必须编写一个消费者,很可能使用更底层的语言,如 VB 或 C#(尽管您可能能够使用 Python),并且最好将其编写为服务。我不知道您在使用这些语言(其中一种)时有多舒服,但是如果您自己编写 COM 对象,那么在 VB6 中编写一个轮询 MSMQ 并调用 COM 对象的可执行文件将是微不足道的。以下是一些帮助您入门的链接。

http://support.microsoft.com/kb/173339

http://technosock.blogspot.nl/2007/07/microsoft-message-queue-from-classical.html

http://www.informit.com/articles/article.aspx?p=131272&seqNum=6

希望这可以帮助,

埃里克

于 2013-05-16T08:32:11.273 回答