Функция неблокируемого режима сна /waitfor/delay для ASP.NET

#asp.net #vb.net

#asp.net #vb.net

Вопрос:

Я пишу ASP.NET класс, который взаимодействует с внешним приложением. Поток транзакций между веб-сервером и этим приложением выглядит следующим образом:

  1. Мой объект записывает файл в каталог.
  2. Внешнее приложение обнаруживает этот файл и обрабатывает его. Это может занять от 1 до 5 секунд.
  3. Внешнее приложение записывает файл ответа в тот же каталог.
  4. Мой объект обнаруживает файл ответов и анализирует результаты.

1-5 секунд, которые могут потребоваться внешнему приложению для обработки моего файла, — это моя проблема. Самый простой способ дождаться файла, похоже, выглядит примерно так:

 Do While Not File.Exists(f)
    Thread.Sleep(500)
Loop
  

Конечно, поток.Sleep () полностью блокирует остальную часть моего веб-сайта до тех пор, пока внешнее приложение не обработает файл. Очевидно, что это не работоспособное решение.

Как я могу эффективно «дождаться» обработки моего файла, не блокируя остальную часть моего веб-сайта?

Ответ №1:

Используйте FileSystemWatcher — когда файл будет создан, он запустит событие, на которое вы можете подписаться.

Комментарии:

1. Я пробовал FileSystemWatcher, но загрузка страницы завершается до запуска события. Кажется, что этот тип решения лучше подходит для функциональности на уровне приложений, но в моей ситуации не будет работать.

2. Мой опыт в основном связан с веб-разработкой, и раскручивать потоки немного выше моих сил. Беглый поиск в Google только еще больше запутал меня. Не могли бы вы, возможно, предоставить простой пример кода или ссылку на объяснение того, как использовать потоковую обработку в этом контексте?

3. Я думаю, что понимаю, но я не думаю, что это выполняет то, что я хочу, чтобы это делало. Запуск нового потока означает, что загрузка страницы завершается, и затем мне приходится перезагружать веб-страницу снова и снова, проверяя, завершен ли поток. Поскольку все, что я делаю, это ожидание создания файла, я могу сделать это без потоков, на самом деле. Для простоты я бы предпочел сохранить это в контексте загрузки одной страницы, но я начинаю задаваться вопросом, возможно ли это вообще без блокировки всего сайта. Мысли?

4. @dansays — Даже без потоковой обработки должны блокироваться только запросы, которые вызвали длительный процесс. Пока на сервере доступно достаточно рабочих процессов и потоков, сайт должен продолжать работать.

5. Использование потока. Метод Sleep (500), упомянутый в моем сообщении, блокирует мою машину разработки в холодном режиме. Сталкиваюсь ли я с искусственным ограничением, наложенным на несерверные экземпляры IIS7?