【问题标题】:Thread Sleep in Classic ASP?经典 ASP 中的线程休眠?
【发布时间】:2008-12-19 01:13:57
【问题描述】:

我正在对用经典 ASP/VbScript 编写的旧应用程序进行一些修改。

它有向应用程序的成员发送电子邮件的功能,但是由于成员列表很大,服务器在发送前一百个左右后拒绝新的电子邮件。

我已经编写了一些代码让它以 20 封的方式发送电子邮件,但这仍然不起作用。我认为也许让它在突发之间休眠一秒钟可能会正常工作。

但是,我似乎在 VbScript 中找不到 Thread.Sleep 类型的方法。

有吗?

【问题讨论】:

  • 知道服务器拒绝电子邮件是因为它们来得太快了吗?
  • Corey,不,但是电子邮件都是有效的,所以我不知道为什么会这样。
  • @Corey:这是某些服务器配置的已知问题。
  • @Jonathan:看看VB代码示例是否有帮助。

标签: asp-classic vbscript


【解决方案1】:

此例程等待任意时间,并且不使用 CPU:

函数 asp_Wait(nMilliseconds) 暗淡的外壳 '' VBS: 设置 oShell=Wscript.CreateObject("WScript.Shell") '' ASP: 设置 oShell=Server.CreateObject("WScript.Shell") 调用 oShell.run("ping 1.1.1.1 -n 1 -w " & nMilliseconds,1,TRUE) '' 选项 TRUE:等到 ping 完成 '' 1000 毫秒等待是 1 秒 结束功能

【讨论】:

  • IP 1.1.1.1 现在被 CloudFlare 占用,所以这不会等待,而是在一些毫秒后返回。
【解决方案2】:

还有一个很好的 hta hack 应该可以工作。在此处查找 A 合成睡眠功能: http://www.mvps.org/scripting/rube/index.htm

【讨论】:

    【解决方案3】:

    你可以使用:

    <html>
    <head>
        <title>Sleep</title>
    </head>
    <body>
        <% 
    
            function Sleep(seconds)
                set oShell = CreateObject("Wscript.Shell")
                cmd = "%COMSPEC% /c timeout " & seconds & " /nobreak"
                oShell.Run cmd,0,1
            End function
    
            Sleep(5)
    
            response.write("End") 
        %>
    </body>
    </html>
    

    【讨论】:

      【解决方案4】:

      您在使用 CDO 吗?由于这被标记为经典 ASP,我猜是这样。

      如果可以的话可以使用

      myMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=1 '(使用取件发送)

      而不是

      myMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2 '(使用端口发送)

      它更可靠,因为它将电子邮件写入文件(通常是 C:\inetpub\mailroot\pickup),并且 IIS 的 SMTP 服务器会检查文件夹中是否有新邮件,如果第一次失败会重试。问题是您必须在 IIS 管理单元中设置 SMTP。

      【讨论】:

        【解决方案5】:

        很抱歉,这个答案与问题并不严格相关,但在尝试回答问题时,它对 cme​​ts 来说有点大。

        @shahka,不同之处在于,当您尝试连接数据库时,代码进入“等待状态”(如回调),因此不使用 CPU 时间。 SESSION 或 THREAD 在做什么并不重要,重要的是 CPU/Core 在做什么 ELSE。

        例如,查找较旧的非多核 CPU。将您的样本设置为休眠 10 秒,然后运行 ​​2-5 秒左右,然后再次休眠 10 秒。这样做大约 20,000 次。在它运行时,尝试使用 box,看看它的响应速度如何。移动窗口,查看 CPU 使用率等。

        这为您提供了这个人的 Web 服务器正在发生的事情的示例。它变得无响应,因为线程调度程序将倾向于“偏爱”未“旋转”的 CPU/核心(我们称之为)。因此,所有 Web 请求、操作系统操作等都将发生在 OTHER 核心上,从而使其超载,给人一种“旋转”的感觉。

        现在,您有时可以对 CPU 进行紧密循环,但这并不重要。但是,在我多年的编程生涯中,我从未发现有必要(故意)编写这样的紧密循环。其中一些又回到以正确的方式和错误的方式做事。以错误的方式做事通常会起作用,但这并不意味着它会正确地起作用。

        如果你想要一个很好的例子,那就去挑选地球上几乎所有的病毒,然后分析它。你会发现它为了造成损害,他们(病毒作者)经常不得不以“错误”的方式做事。当然,它可以完成工作,但它也会破坏病毒,例如,不同语言版本的 Windows,或者它会使整个机器崩溃,从而否定它的目的,等等。

        Greg Hewgill 是我早期从事这类工作的老师之一,由于我与他共事多年,支持他的软件,后来又对他的软件进行了 QA,我从他身上学到了很多东西。 waay 我想告诉你为什么你的代码示例不好。严格来说,代码没问题。有用。它写得很好。但是,它的功能不正确,并且具有其他可能正在阅读本文以寻找知识的成熟程序员不完全理解的不良副作用。这就是我不推荐你的样品的原因。

        【讨论】:

          【解决方案6】:

          据我所知。您必须使用一些用 VB 类编写的外部代码或其他任何东西来完成。

          或忙等待(gak)。

          【讨论】:

          • 是否可以在共享服务器上安装手写 COM 组件?
          • 我猜你需要管理员批准才能这样做
          • 那你应该忙着等待作为惩罚!不要让我安装软件好吗?哇哈哈
          【解决方案7】:

          您知道,这是我认为设置私有 MSMQ 队列可能是一件好事的时期之一。将您要发送的电子邮件放入队列中,并让新开发的 .NET 服务进行发送。这将释放您的 ASP.NET 应用程序,并允许您集中管理您的发送!

          【讨论】:

            【解决方案8】:

            这看起来不错:

            http://www.ehow.com/how_2001270_sleep-asp-using-ado.html

            诀窍是创建一个 ADO 连接对象,然后尝试连接到不存在的服务器。这将在连接对象的超时设置期间阻塞。

            【讨论】:

            • @Bruno:我也喜欢它,但我不承担任何责任。 :)
            • @silverCORE:asp 经典也是如此。为什么不把你的反对票留给真正重要的事情呢?
            • @MusiGenesis 我对 ASP 的看法和你一样,但由于仍然有一些遗留应用程序使用它,无论开发人员对这项技术有何看法,我都必须关心。此外,它使人们失去点击无效链接的时间。为什么不改为编辑您的答案并利用您的时间而不是抱怨反对票?
            【解决方案9】:

            请注意 IIS 的默认 ASP Script execution time-out 默认值为 90 秒,因此运行以这种方式发送大量电子邮件的大型脚本将会超时,除非您更改 asp 超时。

            【讨论】:

              【解决方案10】:
              var shell = Server.CreateObject("WScript.Shell");
              shell.run("CHOICE /C:AB /D:A /T:1 > NUL", 1, true);
              

              【讨论】:

                【解决方案11】:

                答案是不要使用服务器等待,使用客户端。 您可以编写一个 JavaScript,每秒使用 setInterval 调用 Send(),直到队列为空。使用 Ajax 调用使用服务器端脚本发送一封电子邮件。然后,在 ajax 调用返回时,您还可以在 html 页面中指示已发送电子邮件。

                【讨论】:

                  【解决方案12】:

                  如果您将 SQL Server 与 ASP 经典版一起使用,您可以使用 WAITFOR "query" 将脚本暂停几秒钟甚至几毫秒:

                  WAITFOR DELAY '00:00:01.234' -- 1,234 ms
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-06-16
                    • 2014-06-01
                    • 2019-08-12
                    • 2011-09-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多