Я ищу информацию о наилучшем варианте проблемы, над которой я работаю.Лучший вариант для обновлений статуса очереди. NET
Чтобы дать вам некоторый фон, я недавно унаследовал разбитое бизнес-приложение (наш проект использовал его, поэтому мы получили ответственность за его устранение). Я исхожу из фона разработки SharePoint, поэтому немного C#, ASP.NET и SQL.
В настоящее время у нас есть проблема с приложением, в котором мы постоянно получаем ошибки тайм-аута, я сузил его до веб-приложения, называя кучу хранимых процедур для обновления полей статуса в других таблицах, когда что-то меняется, что может повлиять на статус другие объекты.
Без полного ремонта этого приложения я решил, что наш лучший вариант - разгрузить эти хранимые процедуры для работы в фоновом режиме и не привязываться к пользовательскому интерфейсу. Я рассмотрел несколько вариантов, в том числе:
- Создание отдельного потока для обработки исполнения. (Still times out)
- Использование BackgroundWorker (по-прежнему не работает, очевидно, это не должно, но я не могу понять, что вызывает его дождитесь завершения BackgroundWorker)
- Перемещение выполнения хранимой процедуры на задание, которое я затем вызываю из другого SP. (Это работает, но ограничение заключается в том, что я могу выполнить только одно задание сразу, и если несколько пользователей обновляют объекты, они получают исключение, потому что задание не запускается)
Сейчас мы переместили эти хранимые процедуры в сценарий два раза в день, который обновляет все объекты, однако это лишь временное исправление.
У меня есть два варианта, которые я смотрю, и я надеюсь получить некоторые рекомендации по реализации того, что вы считаете лучшим вариантом:
Продолжайте использовать эту работу и иметь исполняемые хранимые процедуры обрабатывают объекты в db, которые задание будет проходить до пустого. Выполняемый хранимый proc должен будет проверить, выполняется ли задание, когда оно добавляет новую запись, а затем действует соответствующим образом.
Было рекомендовано, чтобы я взглянул на использование Service Broker, но я не знаком с его использованием вообще. Я понимаю, что это, скорее всего, будет лучшим общим решением, поскольку оно позволяет мне ставить в очередь эти обновления более транзакционным способом.
Я думаю, что оба эти варианта жизнеспособны, хотя мне нужна помощь в понимании реализации второго варианта. Моя другая проблема заключается в том, что эти хранимые процедуры работают от 45 до 20 м, как я могу уведомить пользователя, который изменил объект, который был сделан его/ее обновлениями? Здесь я отказываюсь от использования задания, потому что я могу просто добавить поле пользователя в «очередь» и сохранить в конце хранимую процедуру отправки быстрого письма.
Мысли, предложения? Может, я передумал?
вы имеете в виду сделать что-то вроде 'Task.Factory.StartNew (() => DAL.UpdateComptuerStatusByApplicationID (originalApplication.AutoNumber), TaskCreationOptions.LongRunning);' я попробовал это и получал тайм-аут на связи SQL , поэтому я увеличил порог тайм-аута, но пользовательский интерфейс все равно зависает до тех пор, пока это не завершится, часто заставляя ASP отключиться. Это потому, что у меня есть это вложенное в другую функцию, которая заставляет вызовы обновлять фактический объект перед вызовом сохраненного proc для обновления статуса? – BAllan