BackgroundWorker из приложения ASP.Net - PullRequest
1 голос
/ 30 ноября 2009

У нас есть приложение ASP.Net, которое предоставляет администраторам возможность работать и выполнять операции с большими наборами записей. Например, у нас есть задача «Польские данные», которую администратор может выполнить, чтобы очистить данные для записи (например, переформатировать телефонные номера, номера социального страхования и т. Д.). При выполнении с небольшим количеством записей задача выполняется относительно быстро , Однако, когда пользователь выполняет задачу с большим набором записей, выполнение задачи может занять несколько минут или дольше. Итак, мы хотим реализовать такие задачи, используя некий асинхронный шаблон. Например, мы хотим иметь возможность запустить задачу, а затем использовать опрос AJAX для предоставления индикатора выполнения и информации о состоянии.

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

Например, я понимаю, что BackgroundWorker будет фактически использовать пул потоков из текущего приложения. В моем случае это веб-сайт ASP.Net. Я читал, что это может быть проблемой, потому что, когда приложение перезагружается, фоновые рабочие будут прекращены. Некоторые из упомянутых выше работ могут занимать 3 минуты, а другие - несколько часов.

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

Итак, я пытаюсь определить, подходит ли использование класса BackgroundWorker и подход, соответствующий нашим потребностям. Стоит ли искать альтернативный подход?

Спасибо и простите за такой длинный пост!

Кевин

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

Исходя из того, что вы говорите, я думаю, что BackgroundWorker не очень хороший выбор.

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

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

1 голос
/ 30 ноября 2009

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

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

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

Чтобы иметь возможность выражать состояние процесса, вам нужно, чтобы приложение ASP.NET могло иметь некоторую ссылку на processID, например, служба WCF возвращает идентификатор guid. Затем у вас есть метод, который, когда вы дадите ему идентификатор процесса, вернет статус процесса. Затем вы можете реализовать опрос этого сервисного вызова, используя AJAX, и отобразить любой тип модальности, какой пожелаете.

Еще одна вещь, которую нужно помнить, это то, что вам нужно спроектировать свои процессы так, чтобы они знали, где они находятся и где они будут, когда будут завершены, чтобы он мог отслеживать состояние, в котором он находится. Например, BatchJobA запущен и будет иметь 1000 записи для обработки. Служба должна знать, на какой записи она находится или каков текущий процент конкурентов, чтобы иметь возможность возвращать информацию в пользовательский интерфейс. Для SQL-запросов, выполнение которых занимает очень много времени, может быть очень проблематично точно определить, где он находится, если только вы не выполняете большую часть предварительной и последующей обработки временных таблиц, которые вы можете в середине ее прочитать для состояния временных таблиц, чтобы понять, где это.

0 голосов
/ 30 ноября 2009

Вы могли бы рассмотреть немного другой подход.

Например, есть таблица команд и управления, в которую вы отправляете команды типа «REFORMAT PHONE NUMBERS» или что-либо еще.

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

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

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

...