Thread Sleep в классическом ASP?

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

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

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

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

Есть ли один?

Ответ 1

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

Или ожидание-ожидание (gak).

Ответ 2

Эта процедура ждет сколько угодно времени и не использует 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

Ответ 4

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

@shahka, разница в том, что когда вы пытаетесь подключиться к БД, код вводит "состояние ожидания" (например, обратный вызов), поэтому время процессора не используется. Неважно, что делает СЕССИЯ или РЕЗЬБА, имеет значение то, что делает ELSE CPU/Core.

В качестве примера можно найти более старый многоядерный процессор. Настройте образец для сна в течение 10 секунд, затем запустите 2-5 секунд или около того, затем снова спящий на 10. Сделайте это примерно 20 000 раз. Пока он работает, попробуйте использовать поле, посмотрите, насколько он отзывчив. Перемещение окон вокруг, просмотр использования ЦП и т.д.

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

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

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

Грег Хьюджилл был одним из моих ранних учителей по этому типу вещей, а так как я работал с ним много лет и поддерживал, и позже QA'ed его программное обеспечение, я многому научился у него, во многом в том же состоянии, что я пытаюсь рассказать вам, почему ваш образец кода не очень хорош. строго говоря, код в порядке. Оно работает. Это хорошо написано. Но, это не ФУНКЦИЯ правильно, и имеет неблагоприятные побочные эффекты, которые другие, maaybe amature программисты, которые, возможно, читают это ищущие знания, не полностью понимают. Вот почему я не рекомендовал ваш образец.

Ответ 5

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

Ответ 6

Это выглядит как хороший взлом:

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

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

Ответ 7

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

Ответ 8

var shell = Server.CreateObject("WScript.Shell");
shell.run("CHOICE /C:AB /D:A /T:1 > NUL", 1, true);

Ответ 9

Используете ли вы 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.

Ответ 10

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

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

Ответ 11

Ответ: не используйте сервер для ожидания, используйте клиент. Вы можете написать javascript, который вызывает вызов Send() каждую секунду, используя setInterval, пока очередь не будет пуста. Используйте Ajax, чтобы отправить одно электронное письмо с использованием серверной части script. Затем при возврате вызова ajax вы также можете указать на странице html, что отправлено электронное письмо.