global.asax函数不从Application_Start调用

时间:2012-11-08 07:41:23

标签: asp.net vb.net multithreading iis

我在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(而不是来自托管服务提供商),因此我可以根据需要进行任何更改。

2 个答案:

答案 0 :(得分:1)

ASP.NET不像桌面应用程序那样工作。你不能启动一个线程让它自己运行。当用户执行请求并且应用程序池处于休眠状态时,将调用Application Start。当它唤醒时,将调用Application Start,但是一旦该函数完成,您创建的任何线程将在用户的其余请求/响应完成时终止。

我可以说的最简单的方法是,在用户的请求/响应完成之前,必须终止在HTTP请求上启动的任何线程,否则您将获得“线程被中止”异常错误。

我发现ASP.NET中线程的最大用途是使用外部资源(例如API)。如果你需要在一个电话中点击多个外部资源,你可以一次性完成它们,但是你必须在请求/响应完成之前加入它们。

答案 1 :(得分:0)

在托管服务器上载代码后,您将需要重新启动IIS服务器

START菜单> RUN> iisreset