Asp classic 经典ASP中的线程睡眠?

Asp classic 经典ASP中的线程睡眠?,asp-classic,vbscript,Asp Classic,Vbscript,我正在修改一个用经典ASP/VbScript编写的旧应用程序 它具有向应用程序的成员发送电子邮件的功能,但由于成员列表非常大,服务器会在发送大约100封新电子邮件后拒绝新邮件 我已经编写了一些代码,使它能够在20秒内发送电子邮件,但这仍然不起作用。我认为,也许让它在爆发之间睡上一秒钟可能会正常工作 但是,我似乎在VbScript中找不到Thread.Sleep类型的方法 有吗?据我所知,没有。您必须使用一些用VB类编写的外部代码或其他任何东西来完成它 或者忙等待(gak)。您知道,这是我认为设置

我正在修改一个用经典ASP/VbScript编写的旧应用程序

它具有向应用程序的成员发送电子邮件的功能,但由于成员列表非常大,服务器会在发送大约100封新电子邮件后拒绝新邮件

我已经编写了一些代码,使它能够在20秒内发送电子邮件,但这仍然不起作用。我认为,也许让它在爆发之间睡上一秒钟可能会正常工作

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


有吗?

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


或者忙等待(gak)。

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

这看起来是一个很好的破解:


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

还有一个好的hta hack应该可以工作。请在此处查找合成睡眠功能:

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

很抱歉,此答案与问题没有严格的关系,但在尝试回答问题时,它只是以大的方式进行评论

@shahka,不同之处在于,当您尝试连接到DB时,代码进入“等待状态”(如回调),因此不使用CPU时间。重要的不是会话或线程在做什么,而是CPU/内核在做什么

例如,查找较旧的非多核CPU。将样本设置为睡眠10秒,然后运行2-5秒左右,然后再次睡眠10秒。这样做大约20000次。当它运行时,试着使用box,看看它的响应有多快。移动窗口,观察CPU使用情况等

这让你知道这个人的网络服务器发生了什么。它变得无响应,因为线程调度程序倾向于“偏爱”未“旋转”(我们称之为“旋转”)的CPU/内核。因此,所有的web请求、操作系统操作等都将发生在另一个内核上,因此会过载,给它一种“旋转”的感觉

现在,您可以将CPU紧密循环,这并不重要。但是,在我多年的编程生涯中,我从未发现有必要(故意)编写这样的紧密循环。有些人回到了正确的方式,也有些人回到了错误的方式。用错误的方法做某事通常是可行的,但这并不意味着它能正常工作

如果你想要一个很好的例子,去挑选这个星球上的任何病毒,并对其进行分析。你会发现,为了造成损害,他们(病毒作者)往往不得不以“错误”的方式行事。当然,它完成了任务,但它也破坏了病毒,比如说,一个不同语言版本的Windows,或者它破坏了整个机器,否定了它的目的,等等


他是我早期的老师之一,我和他一起工作了很多年,支持他的软件,后来对他的软件进行了质量鉴定,我从他那里学到了很多东西,就像我试图告诉你为什么你的代码样本不好一样。严格地说,代码是好的。它起作用了。写得很好。但是,它不能正常工作,并且具有其他可能正在阅读本书以寻求知识的业余程序员无法完全理解的不利副作用。这就是我不推荐您的示例的原因。

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

Function asp_Wait(nMilliseconds) Dim oShell '' VBS: Set oShell= Wscript.CreateObject("WScript.Shell") '' ASP: Set oShell= Server.CreateObject("WScript.Shell") Call oShell.run("ping 1.1.1.1 -n 1 -w " & nMilliseconds,1,TRUE) '' Option TRUE: Wait until ping is complete '' 1000 milli-second wait is 1 second End Function 函数asp\U等待(N毫秒) 迪姆奥谢尔酒店 “”VBS:Set-oShell=Wscript.CreateObject(“Wscript.Shell”) “”ASP: 设置oShell=Server.CreateObject(“WScript.Shell”) 调用oShell.run(“ping 1.1.1-n1-w”和n毫秒,1,TRUE) “”选项TRUE:等待ping完成 “”1000毫秒等待是1秒 端函数
你在用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。

您可以使用:

<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>

睡觉

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

如果您使用SQL Server和ASP classic,则可以使用“查询”将脚本暂停几秒钟甚至几毫秒:

等待延迟“00:00:01.234”-1234毫秒
是否可以在共享服务器上安装手写COM组件?我想您需要管理员批准才能安装,然后您应该忙着等待,以示惩罚!不要让我安装软件,好吗?muahahahaYou知道服务器拒绝电子邮件是因为它们发送得太快了吗?Corey,没有,但是电子邮件都是有效的,所以我不知道为什么会这样。@Corey:这是一些服务器配置的已知问题。@Jonathan:看看VB代码示例是否有帮助。@Bruno:我也喜欢,但我
<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>