经典ASP中的线程睡眠?

时间:2008-12-19 01:13:57

标签: asp-classic vbscript

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

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

我写了一些代码,让它发送20封的电子邮件,但这仍然不起作用。我认为也许让它在爆发之间睡一会儿可能会正常工作。

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

有吗?

12 个答案:

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