Сон нить в классическом ASP?

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

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

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

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

Есть один?

Вы ЗНАТЬ, что сервер отклоняет электронные письма, потому что они приходят слишком быстро?

Corey Trager 19.12.2008 04:49

Кори, нет, но все электронные письма действительны, так что я не понимаю, с чего еще.

FlySwat 19.12.2008 04:56

@Corey: это известная проблема с некоторыми конфигурациями серверов.

NotMe 19.12.2008 05:02

@Jonathan: Посмотрите, поможет ли пример кода VB.

shahkalpesh 19.12.2008 06:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
4
27 001
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

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

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

Можно ли установить написанный вручную компонент COM на общий сервер?

FlySwat 19.12.2008 04:25

Думаю, для этого вам понадобится одобрение администратора

1800 INFORMATION 19.12.2008 04:36

Тогда тебе стоит заняться-подожди в наказание! Не позволяй мне устанавливать программное обеспечение, ладно? муахахаха

1800 INFORMATION 19.12.2008 04:43

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

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

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

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

@Bruno: Мне тоже понравилось, но я снимаю с себя всякую ответственность за это. :)

MusiGenesis 19.12.2008 04:56

@silverCORE: как и классика asp. Почему бы не сохранить ваши отрицательные голоса для чего-то действительно важного?

MusiGenesis 18.11.2011 22:08

@MusiGenesis Я чувствую то же, что и вы, в отношении ASP, но, поскольку есть еще некоторые устаревшие приложения, которые его используют, независимо от того, как разработчики относятся к технологии, мне нужно заботиться. Кроме того, люди теряют время, нажимая на ссылку, которая не работает. Почему бы вместо этого отредактировать свой ответ и использовать для этого свое время вместо того, чтобы жаловаться на голоса против?

GR7 19.11.2011 09:15

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

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

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

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

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

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

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

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

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

Эта процедура ожидает любое количество времени и не использует ЦП:

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

IP 1.1.1.1 теперь используется CloudFlare, поэтому он не будет ждать, а вернется через несколько мс.

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

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

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

<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, который будет вызывать Send () каждую секунду с помощью setInterval, пока очередь не станет пустой. Используйте вызов Аякс, чтобы отправить одно электронное письмо с помощью сценария на стороне сервера. Затем при возврате вызова ajax вы также можете указать на странице html, что электронное письмо было отправлено.

Если вы используете SQL Server с классическим ASP, вы можете использовать «запрос» WAITFOR, чтобы остановить скрипт на секунды или даже миллисекунды:

WAITFOR DELAY '00:00:01.234' -- 1,234 ms

Другие вопросы по теме