2012-11-08 64 views
0

我正在寫一個global.asax文件中的函數,它需要從application_start中聲明的線程中調用。 它在我的調試模式下工作正常,但是在託管時不會調用回調函數。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,所以我可以根據需要進行任何更改。

+1

最終你會得到一個堆棧溢出由於UpdateQueue'的'遞歸。 –

+0

'writeLog()'裏有什麼?也許有鎖。 –

+0

writeLog只是寫入一個文件,而不是自己鎖定 – AjayR

回答

1

ASP.NET不能像桌面應用程序一樣工作。你不能啓動一個線程並讓它自行運行。當用戶執行請求並且應用程序池處於睡眠狀態時,Application Start會被調用。當它醒來時,Application Start被調用,但一旦函數完成,您創建的任何線程將在用戶請求/響應的其餘部分完成時終止。

我可以說的最簡單的方式是,您在HTTP請求上啓動的任何線程必須在該用戶的請求/響應完成之前終止,否則您會得到「線程被中止」異常錯誤。

我發現在ASP.NET中線程最大的用處是使用外部資源(如API)。如果您需要在通話中點擊多個外部資源,您可以一次完成所有這些資源,但必須在請求/響應完成之前加入它們。

0

託管服務器上上傳代碼之後,您將需要重新啓動IIS服務器

開始菜單>運行> IISRESET

+0

我試過了,但沒有運氣 – AjayR

相關問題