gpt4 book ai didi

ASP.NET 后台工作线程

转载 作者:行者123 更新时间:2023-12-02 15:39:26 25 4
gpt4 key购买 nike

具有 ASP.NET 2.0 Web 应用程序,应允许发送电子邮件。我有一个立即发送电子邮件的 Windows 服务。我的 Web 应用程序根据某些模板撰写电子邮件消息并将其放入 MSMQ 中,服务从那里获取它。

问题是从模板撰写消息可能需要一些时间,我不希望用户在撰写消息并将其传递到服务时等待。

我考虑一些后台进程来监听内部通知请求队列。如果队列为空,则进程不执行任何操作,但一旦消息出现,它就开始处理消息。我只想有一个进程,而不是创建很多线程。

目前我的想法是编写任务调度程序,其中将包含通知请求队列。当新项目添加到队列时,调度程序检查发送通知的进程是否正在运行。如果是,那么它只是将请求添加到队列中。否则,它会创建新线程来读取队列直到队列为空并执行通知请求。

我担心的是,我需要确保在 ASP.NET 完成对客户端的响应后我的线程不会终止,因为它是我线程的父线程。问题是最好的方法是什么(或者是否有可能做到)?

附注如果 IIS 由于用户不活动而回收 ASP.NET 进程,那么我的线程终止是正常的。

最佳答案

我使用下面的类作为基类。我继承了这个类并将我的逻辑放入其中。然后,我将此类的实例存储在 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

关于ASP.NET 后台工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5093397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com