【问题标题】:global.asax function not calling from Application_Startglobal.asax 函数未从 Application_Start 调用
【发布时间】:2012-11-08 07:41:22
【问题描述】:

我正在 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,因此我可以根据需要进行任何更改。

【问题讨论】:

  • 由于UpdateQueue的递归,最终你会得到一个堆栈溢出。
  • writeLog() 中有什么内容?也许有一把锁。
  • writeLog 只是写入文件,而不是自己锁定
  • 你能建议我吗,我该如何进行后台处理

标签: asp.net vb.net multithreading iis


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    开始菜单 > 运行 > iisreset

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多