0

我正在 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

我看到像 Thread Starting Thread Started 这样的日志文件

但没有在“UpdateQue”功能中打印的其他消息我也尝试了其他方法。1. 使用定时器:与上述相同的问题 2. 使用 Thread.Timers:与上述相同的问题 3. 直接从 application_start 调用 UpdateQueue 函数:进入 UpdateQue 函数并写入日志条目。

我无法弄清楚为什么服务器出现问题。我在我的公共 IP(不是来自托管服务提供商)中使用 IIS 7,因此我可以根据需要进行任何更改。

4

2 回答 2

1

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

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

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

于 2012-11-08T08:58:53.803 回答
0

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

开始菜单 > 运行 > iisreset

于 2012-11-08T09:10:26.910 回答