Фоновый рабочий поток ASP.NET - PullRequest
3 голосов
/ 23 февраля 2011

A имеет веб-приложение ASP.NET 2.0, которое должно позволять отправлять электронные письма. У меня есть служба Windows, которая отправляет электронную почту немедленно. Мое веб-приложение создает сообщение электронной почты согласно некоторому шаблону и помещает его в MSMQ, и служба получает его оттуда.

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

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

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

Меня беспокоит то, что я должен быть уверен, что мой поток не умрет после того, как ASP.NET завершит ответ клиенту, потому что это родительский поток для моего потока. И вопрос в том, как лучше всего это сделать (или это возможно)?

P.S. Это нормально, что мой поток умирает, если IIS перезапускает процесс ASP.NET из-за неактивности пользователя.

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Я использую класс ниже в качестве базового класса.Я наследую от этого класса и помещаю свою логику в него.Затем я сохраняю экземпляр этого класса в кэше ASP.Net, чтобы сохранить ссылку, и я всегда могу ее найти.Для ваших целей после наследования от этого класса внутри ExecuteProcess создайте бесконечный цикл while «while (true)», затем поместите задержку в начало / конец цикла «thread.sleep (500)» или что-то в этом роде.Каждый цикл проверяет наличие сообщений в очереди.

Imports System.Threading

Public MustInherit Class LongRunningProcess
    Public ReadOnly Property Running() As Boolean
        Get
            Return _Running
        End Get
    End Property

    Public ReadOnly Property Success() As Boolean
        Get
            Return _Success
        End Get
    End Property

    Public ReadOnly Property Exception() As Exception
        Get
            Return _Exception
        End Get
    End Property

    Public ReadOnly Property StartTime() As DateTime
        Get
            Return _StartTime
        End Get
    End Property

    Public ReadOnly Property EndTime() As DateTime
        Get
            Return _EndTime
        End Get
    End Property

    Public ReadOnly Property Args() As Object
        Get
            Return _Args
        End Get
    End Property


    Protected _Running As Boolean = False
    Protected _Success As Boolean = False
    Protected _Exception As Exception = Nothing
    Protected _StartTime As DateTime = DateTime.MinValue
    Protected _EndTime As DateTime = DateTime.MinValue
    Protected _Args() As Object = Nothing
    Protected WithEvents _Thread As Thread

    Private _locker As New Object()

    Public Sub Execute(ByVal Arguments As Object)
        SyncLock (_locker)
            'if the process is not running, then...'
            If Not _Running Then
                'Set running to true'
                _Running = True
                'Set start time to now'
                _StartTime = DateTime.Now
                'set arguments'
                _Args = Arguments
                'Prepare to process in a new thread'
                _Thread = New Thread(New ThreadStart(AddressOf ExecuteProcess))

                'Start the thread'
                _Thread.Start()
            End If
        End SyncLock
    End Sub

    Protected MustOverride Sub ExecuteProcess()
End Class
1 голос
/ 23 февраля 2011

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

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

0 голосов
/ 23 февраля 2011

Вы можете создать веб-службу, в которой вы можете выполнять асинхронные вызовы из приложения ASP.NET.Асинхронный вызов позволит вам совершать звонки, не блокируя основной поток.Я думаю, что вы можете делать односторонние вызовы и не нужно ждать завершения потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...