Если у вас есть контроль над сервером, то я, вероятно, воспользуюсь службой Windows (например, Злой Грибо сказал ).
Но, если вы этого не сделаете, я бы создал класс, возможно, похожий на класс ниже, который вы можете использовать / наследовать. Создайте экземпляр этого класса во время события Application_start в global.asax и сохраните его копию в кеше. Поместите свою логику в метод «ExecuteProcess». Ваша логика, вероятно, будет выглядеть примерно так (псевдокод):
while(true)
check for events that need to have notifications sent
send any needed notifications
wait x seconds and repeate
loop
Убедитесь, что в таблице базы данных MSSQL имеется поле для отслеживания того, было ли отправлено уведомление.
Базовый базовый класс:
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
Свойство Args предоставляет вам доступ из «ExecuteProcess» к любым аргументам / переменным, которые вам могут понадобиться.