Как мне запрограммировать очередь для запуска внешних приложений в ASP.NET? - PullRequest
1 голос
/ 26 августа 2009

Использование C # ASP.NET Я хочу запрограммировать очередь. Я хочу иметь номер X процесса. Когда он заканчивается, он должен взять следующий элемент в списке и обработать его. Я считаю, что самый простой способ - вставить и удалить его из базы данных SQL. Моя проблема:

Как мне начать это, когда я добавляю первый элемент? Запустить отдельный поток? AFAIK каждое соединение с моей средой разработки и сервером является собственным потоком? Мне нужно что-то заблокировать, запустить поток, чтобы обработать список, затем разблокировать и позволить thead продолжать работу, пока он не будет завершен? Итак ... 1) Должен ли я запускать темы? Если да, то какой? (Я еще не делал многопоточность в C #) 2) Должен ли я иметь статический мьютекс в моем проекте ASP.NET? И заблокировать его при запуске темы? (статические переменные все еще совместно используются в соединениях / потоках ASP правильно?) Или я не должен делать это и запускать их по-другому?

ПРИМЕЧАНИЕ. Я могу захотеть запустить 2 процесса вместо 1, и я могу захотеть запустить другие процессы для других целей (например, 2 FFmpeg + 5 ImageMagick.)

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

Типичное приложение ASP.NET фактически разделяет поток для нескольких запросов (хотя его можно настроить для использования одного потока на запрос). Я бы не рекомендовал менять его для использования одного потока на запрос.

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

Ваш лучший выбор здесь - настроить MSMQ (или, возможно, даже использовать SQS от Amazon) и иметь службу Windows, которая извлекает сообщения из очереди и обрабатывает их. Процесс будет выглядеть так: queue sequence

0 голосов
/ 26 августа 2009

Ответ на мозговой штурм. Я не знаю, сработает ли это.

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

чтобы все было организовано и просто; Имейте мастер-класс, который действует как утилита, управляющая количеством каждого процесса, который вы хотите запустить, и для фактического запуска. Вызовите класс в void Application_Start(object sender, EventArgs e), чтобы создать начальный главный поток, который запустит любой процесс (или потоки), который вам нужен. Позвольте ему усыпить себя и используйте служебные методы, чтобы разбудить его и передать сообщения. Затем обработайте остальное по мере необходимости:)

0 голосов
/ 26 августа 2009

Во-первых, звучит так, как будто вам действительно нужна служба Windows.

Тем не менее, если вы намерены использовать ASP.NET для этого, может сработать следующее:

  • Создайте одну .aspx страницу, единственной целью которой является обработка одной единицы работы.
  • Иметь другую страницу (подойдет HTML), которая использует JavaScript для асинхронной загрузки вашей первой страницы (используя метод jQuery $. Load () ).
  • Когда $ .load () вернется, вы будете знать, что задание завершено, и вы можете сделать еще один запрос для обработки следующего задания.
  • При желании вы можете поместить что-то на возвращенную страницу, чтобы указать, остались ли в очереди какие-либо оставшиеся единицы работы. Это позволит вам вернуться на сторону клиента, когда не нужно выполнять какую-либо работу.

Пример на стороне клиента

<script type="text/javascript">
    $(document).ready(function() {
        processJob();
    });

    function processJob() {
        $('#result').load("ProcessOneJob.aspx", function() {
            // called when ProcessOneJob.aspx comes back
            processJob();
        });
    }
</script>

Плюсы к этому подходу:

  • Относительно прост в реализации
  • Не нужно разбираться с нитями / блокировкой
  • Нет службы для установки

Против

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