簡體   English   中英

使用計時器會導致HttpContext.Current為null

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM