[英]use of timer causes HttpContext.Current to be null
我有一個解析輸入文件的功能。
Private Function getSvSpelOdds(ByVal BombNo As Integer) As Boolean
Dim InputFileBase As String = HttpContext.Current.Application("InputFileBase")
strInputFile = InputFileBase & "PC_P7_D.TXT"
OddsReader = New StreamReader(strInputFile)
'some other code
End Function
如果文件不存在(getSvSpelOdds返回False),我想在30秒后重試。 為此,我使用計時器。
If Not getSvSpelOdds(y) Then
Timer1.Interval = 30000
End If
Private Sub Timer1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
getSvSpelOdds(y)
End Sub
問題在於,當計時器觸發HttpContext.Current時(用於獲取gloal變量的值)為null。
我是否應該使用其他方法使它起作用?
如前所述,由於在不同線程中調用了Timer_Elapsed,因此HttpContext應該為null。 但是您可以使用System.Web.HttpRuntime.Cache傳遞文件名,應該可以從所有線程訪問緩存。
HttpContext.Current
僅在處理傳入線程的線程上調用時為您提供所需的上下文。
在此類線程之外調用它時,您將得到null
。 這與您的情況相符,因為Timer1_Elapsed在新線程上執行。
計時器上的Elapsed事件將在單獨的線程上運行,因此,其對於當前上下文的預期行為為null。
您只能從同一線程訪問它。
我是否應該使用其他方法使它起作用?
是的,鑒於ASP.NET的工作原理很復雜,因此將ASP.NET和線程混合在一起通常不是一個好主意。 就像已經提到的,它不是一個很棒的用戶體驗,它在30秒鍾內沒有反饋,最好讓用戶知道實際情況。
另外,您需要確定超時時間是否合適或是否完全需要超時。 我不知道您的應用程序的性質,但是我認為您的站點可以通過某種外部方式來生成和提取文件。
我是否應該使用其他方法使它起作用?
幾乎可以肯定,是的。 30秒是很長的等待時間,不會給用戶任何反饋。
向用戶返回“尚無可用結果,但我們仍在尋找”頁面可能會更好。 通過添加適當的元標記,可以將該頁面設置為在30秒后自動刷新:
<META HTTP-EQUIV="refresh" CONTENT="30">
然后,您將在服務器上獲得新的請求/響應周期。 同時也沒有占用服務器資源。
其他答案似乎可以解決您問題的另一部分(關於為什么它在計時器回調中不起作用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.