Нить спать в классическом ASP? - PullRequest
11 голосов
/ 19 декабря 2008

Я делаю ревизию старого приложения, написанного на классическом ASP / VbScript.

Он имеет функцию отправки электронного письма участникам приложения, но поскольку список участников довольно большой, сервер отклоняет новые электронные письма после отправки первой сотни или около того.

Я написал некоторый код, чтобы заставить его отправлять электронные письма в серии 20, но это все еще не работает. Я думаю, что, возможно, заставить его спать на секунду между вспышкой может работать должным образом.

Однако я не могу найти метод типа Thread.Sleep в VbScript.

Есть ли один?

Ответы [ 11 ]

8 голосов
/ 23 июня 2011

Эта процедура ждет сколько угодно времени и не использует процессор:

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
5 голосов
/ 19 декабря 2008

есть также хороший хта-хак, который должен работать. Посмотрите на функцию синтетического сна здесь: http://www.mvps.org/scripting/rube/index.htm

3 голосов
/ 27 апреля 2012

Вы можете использовать:

<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>
3 голосов
/ 13 апреля 2012

Вы используете 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), а SMTP-сервер IIS проверяет папку на наличие новой почты и повторяет попытку в случае сбоя в первый раз. Проблема в том, что вы должны настроить SMTP в оснастке IIS.

3 голосов
/ 23 декабря 2008

Извините, что этот ответ не имеет прямого отношения к вопросу, но, пытаясь ответить на вопрос, он просто получил большое значение для комментариев.

@ shahka, разница в том, что когда вы пытаетесь подключиться к БД, код переходит в «состояние ожидания» (как обратный вызов), поэтому процессорное время не используется. Не имеет значения, что делает СЕССИЯ или НИТИ, а имеет значение то, что ДРУГОЙ процессор / ядро ​​делает.

Например, найдите старый, не многоядерный процессор. Настройте ваш образец на 10 секунд, затем на 2-5 секунд или около того, затем снова на 10 секунд. Сделайте это около 20000 раз. Пока он работает, попробуйте и используйте box, посмотрите, насколько он отзывчивый. Перемещайте окна, наблюдайте за использованием процессора и т. Д.

Это дает вам пример того, что происходит с веб-сервером этого человека. Он перестает отвечать на запросы, потому что планировщик потоков будет стремиться «отдать предпочтение» CPU / Core, который НЕ «раскручивается» (как мы его называем). Таким образом, ВСЕ веб-запросы, операции ОС и т. Д. Будут происходить на ДРУГОМ ядре, что приводит к его перегрузке, что также создает ощущение «раскрутки».

Теперь у вас есть моменты, когда вы можете зациклить процессор, и это не будет иметь значения. Но за все мои годы программирования я никогда не считал необходимым написать такой замкнутый цикл (специально). Некоторые из них возвращаются к правильному и неправильному поступку. Часто что-то работает неправильно, но это не значит, что оно работает ПРАВИЛЬНО.

Если вы хотите хороший пример этого, идите и выберите любой вирус на планете и проанализируйте его. Вы обнаружите, что для того, чтобы нанести ущерб, им (вирусописателям) часто приходится делать вещи «неправильным» образом. Конечно, он выполняет свою работу, но он также разрушает вирус, скажем, на другой языковой версии Windows, или он разбивает всю машину, отрицая ее назначение и т. Д.

Грег Хьюгилл был одним из моих ранних учителей об этом типе вещей, и так как я работал с ним в течение многих лет и поддерживал, а затем проверял его программное обеспечение, я многому у него научился Многое в том же духе, я пытаюсь сказать вам, почему ваш пример кода не подходит. строго говоря, код в порядке. Оно работает. Это хорошо написано. Но он не работает должным образом и имеет неблагоприятные побочные эффекты, которые другие, возможно, восхищают программистов, которые читают это в поисках знаний, не до конца понимают. Вот почему я не рекомендовал ваш образец.

2 голосов
/ 10 октября 2011
var shell = Server.CreateObject("WScript.Shell");
shell.run("CHOICE /C:AB /D:A /T:1 > NUL", 1, true);
2 голосов
/ 19 декабря 2008

Имейте в виду, что IIS имеет значение по умолчанию Время ожидания выполнения сценария ASP значение по умолчанию составляет 90 секунд, поэтому выполнение больших сценариев, отправляющих тома электронной почты таким образом, будет превышено, если вы не измените время ожидания asp.

2 голосов
/ 19 декабря 2008

Это похоже на хороший взлом:

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

Хитрость заключается в том, чтобы создать объект подключения ADO и затем попытаться подключиться к несуществующему серверу. Это заблокирует на время установки тайм-аута объекта соединения.

2 голосов
/ 19 декабря 2008

Вы знаете, это один из тех случаев, когда я думаю, что установка частной очереди MSMQ может быть хорошей идеей. Поместите сообщения электронной почты, которые вы хотите отправить, в очередь, и только что созданная служба .NET выполняет отправку. Это освободит ваше приложение ASP.NET и позволит вам централизованно управлять отправкой!

2 голосов
/ 19 декабря 2008

Не в моих силах. Вам придется использовать некоторый внешний код, написанный в классе VB, или любой другой для этого.

Или занято-подождите (гак).

...