我在global.asax文件中编写一个函数,需要从在application_start中声明的线程调用。 它在我的调试模式下工作正常,但在托管时不调用回调函数。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
writeLog("Application Initialized")
writeLog("Thread is starting....")
Dim T As New Threading.Thread(AddressOf UpdateQueue)
T.Start()
writeLog("Thread Started....")
End Sub
Sub UpdateQueue()
writeLog("UpdateQueue entry")
While Q.Count > 0
' Some logic
End While
writeLog("UpdateQueue going for idle state")
Threading.Thread.Sleep(5000)
UpdateQueue()
End Sub
我看到日志文件就像 线程开始 线程已开始
但没有在“UpdateQue”函数中打印的其他消息 我也试过其他方法。 1.使用定时器:与上述相同的问题 2.使用Thread.Timers:与上面相同的问题 3.直接从application_start调用UpdateQueue函数:输入UpdateQue函数并写入日志条目。
我无法弄清楚服务器中的问题原因。我在我的公共IP中使用IIS 7(而不是来自托管服务提供商),因此我可以根据需要进行任何更改。
答案 0 :(得分:1)
ASP.NET不像桌面应用程序那样工作。你不能启动一个线程让它自己运行。当用户执行请求并且应用程序池处于休眠状态时,将调用Application Start。当它唤醒时,将调用Application Start,但是一旦该函数完成,您创建的任何线程将在用户的其余请求/响应完成时终止。
我可以说的最简单的方法是,在用户的请求/响应完成之前,必须终止在HTTP请求上启动的任何线程,否则您将获得“线程被中止”异常错误。
我发现ASP.NET中线程的最大用途是使用外部资源(例如API)。如果你需要在一个电话中点击多个外部资源,你可以一次性完成它们,但是你必须在请求/响应完成之前加入它们。
答案 1 :(得分:0)
在托管服务器上载代码后,您将需要重新启动IIS服务器
START菜单> RUN> iisreset