1

我有一个解析输入文件的函数。

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 变量的值)时为空。

我应该使用其他方法来让它工作吗?

4

4 回答 4

1

如前所述,HttpContext 应该为 null,因为 Timer_Elapsed 在不同的线程中被调用。但是您可以使用 System.Web.HttpRuntime.Cache 来传递文件名,缓存应该可以从所有线程访问。

于 2013-09-06T07:27:32.253 回答
0

HttpContext.Current仅当您在处理传入线程的线程上调用它时才为您提供所需的上下文。

在此类线程之外调用它时,您会得到null. 这符合您的情况,因为 Timer1_Elapsed 在新线程上执行。

于 2013-09-06T07:25:38.197 回答
0

Timer 上的 Elapsed 事件将在单独的线程上运行,因此当前上下文的预期行为为空。

您只能从同一个线程访问它。

我应该使用其他方法来让它工作吗?

是的,考虑到 ASP.NET 工作方式的复杂性,混合 ASP.NET 和线程通常不是一个好主意。就像已经提到的那样,在 30 秒内没有反​​馈并不是一个很好的 UX,最好让用户知道实际发生了什么。

此外,您需要确定超时长度是否合适或是否需要超时。我不知道您的应用程序的性质,但我认为有一些外部方法可以让您的站点生成和获取文件。

于 2013-09-06T07:27:35.800 回答
0

我应该使用其他方法来让它工作吗?

几乎可以肯定,是的。30 秒是很长的等待时间,却没有给用户任何反馈。

向用户返回“尚无可用结果,但我们仍在寻找”页面可能会更好。通过添加合适的元标记,可以将该页面设置为 30 秒后自动刷新:

<META HTTP-EQUIV="refresh" CONTENT="30">

然后你会在服务器上获得一个新的请求/响应周期。并且在此期间没有占用服务器资源。


其他答案似乎解决了您问题的另一部分(关于为什么它在计时器回调中不起作用)

于 2013-09-06T07:36:33.550 回答