我正在对使用经典ASP / VbScript编写的旧应用程序进行一些修订。
它具有向应用程序成员发送电子邮件的功能,但由于成员列表非常大,服务器在发送前一百个左右后拒绝新的电子邮件。
我写了一些代码,让它发送20封的电子邮件,但这仍然不起作用。我认为也许让它在爆发之间睡一会儿可能会正常工作。
但是,我似乎无法在VbScript中找到Thread.Sleep类型的方法。
有吗?
答案 0 :(得分:8)
此例程等待任何时间,并且不使用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
答案 1 :(得分:5)
还有一个很好的hta hack应该可行。在这里寻找A合成睡眠功能: http://www.mvps.org/scripting/rube/index.htm
答案 2 :(得分:3)
很抱歉,这个答案与这个问题没有严格的关系,但是在尝试回答一个问题时,它只是为了征求意见。
@shahka,区别在于,当您尝试连接到数据库时,代码进入“等待状态”(如回调),因此不使用CPU时间。重要的不是SESSION或THREAD在做什么,重要的是CPU / Core正在做什么。
例如,找一个较旧的非多核CPU。将样品设置为睡眠10秒钟,然后运行2-5秒左右,然后再次睡眠10次。大约20,000次。在它运行时,尝试并使用框,看看它的响应性。移动窗口,观察CPU使用情况等。
这可以让你了解这个人的Web服务器发生了什么。它变得没有响应,因为线程调度程序倾向于“偏爱”没有“旋转”的CPU / Core(正如我们所说的那样)。因此,所有Web请求,操作系统操作等都将在OTHER核心上发生,从而使其过载,从而使其感觉“被旋转”。
现在,您有时可以紧密循环CPU并且无关紧要。但是,在我多年的编程中,我从未发现有必要像这样编写一个紧密的循环(故意)。其中一些回归以正确的方式和错误的方式做事。以错误的方式做事通常会起作用,但这并不意味着它正确地工作。
如果你想要一个很好的例子,去挑选地球上的任何病毒,并进行分析。你会发现它要做损坏,它们(病毒编写者)经常要以“错误”的方式做事。当然,它完成了工作,但它也打破了病毒,例如Windows的不同语言版本,或者它崩溃了整个机器,否定了它的目的等等。
Greg Hewgill是我早期的老师之一,关于这种类型的东西,因为我和他一起工作了很多年,并得到了支持,后来QA'ed他的软件,我从他身上学到了很多东西,很多同样的waay我想告诉你为什么你的代码样本不好。严格来说,代码很好。有用。写得很好。但是,它没有正确的功能,并且具有不良的副作用,其他的,可能正在阅读这个寻找知识的不成熟的程序员并不完全理解。这就是为什么我不推荐你的样品。
答案 3 :(得分:3)
您使用的是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。
答案 4 :(得分: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>
答案 5 :(得分:2)
据我所知。你将不得不使用VB类中编写的一些外部代码或其他任何东西。
或忙碌等待(gak)。
答案 6 :(得分:2)
你知道,这是我认为设置私有MSMQ队列可能是一件好事的时间之一。将要发送的电子邮件放在队列中,并使用新开发的.NET服务进行发送。这将释放您的ASP.NET应用程序,并允许您集中管理您的发送!
答案 7 :(得分:2)
这看起来很不错:
http://www.ehow.com/how_2001270_sleep-asp-using-ado.html
诀窍是创建一个ADO连接对象,然后尝试连接到不存在的服务器。这将阻止连接对象的超时设置的持续时间。
答案 8 :(得分:2)
请注意,IIS的默认ASP Script execution time-out默认值为90秒,因此运行以这种方式发送大量电子邮件的大型脚本将超时,除非您更改了asp超时。
答案 9 :(得分:2)
var shell = Server.CreateObject("WScript.Shell");
shell.run("CHOICE /C:AB /D:A /T:1 > NUL", 1, true);
答案 10 :(得分:0)
答案是不要使用服务器等待,使用客户端。 您可以编写一个javascript,每秒使用setInterval调用Send()直到队列为空。使用Ajax调用使用服务器端脚本发送一封电子邮件。然后在返回ajax调用时,您还可以在html页面中指示已发送电子邮件。
答案 11 :(得分:0)
如果您将SQL Server与ASP Classic一起使用,则可以使用WAITFOR
“查询”将脚本停顿几秒钟甚至几毫秒:
WAITFOR DELAY '00:00:01.234' -- 1,234 ms