0

您好,我正在尝试编写以下代码来触发 MyHelper 方法。但它没有在 timScheduledTask.Elapsed 触发,
请任何人帮忙,触发 MyHelper 方法的最佳方法是什么?

 Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

        Dim timScheduledTask As New System.Timers.Timer
        timScheduledTask.Interval = 600 * 1000 //in milliseconds    
        timScheduledTask.Enabled = True
        timScheduledTask.Start()
    **AddHandler timScheduledTask.Elapsed, AddressOf MyHelper**    
    End Sub

    Protected Sub MyHelper(ByVal sender As Object, ByVal e As EventArgs)
        //Just Do something        
    End Sub
4

2 回答 2

0

您的问题是该函数timScheduledTask的位置变量Application_Start。一旦这个函数完成,定时器的实例就会被垃圾收集器销毁。如果您将计时器存储在类变量中,您应该没问题。

例如像这样:

Public Class Foo
    Private timScheduledTask As System.Timers.Timer

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        timScheduledTask = New System.Timers.Timer
        timScheduledTask.Interval = 600 * 1000 //in milliseconds    
        timScheduledTask.Enabled = True
        timScheduledTask.Start()
        AddHandler timScheduledTask.Elapsed, AddressOf MyHelper   
    End Sub

    Protected Sub MyHelper(ByVal sender As Object, ByVal e As EventArgs)
        Dim ds As DataSet = obj1.Dataset()

        Dim onRemoveCallback As CacheItemRemovedCallback

        _cache.Insert("ResultDataset", ds, New CacheDependency("C:\AspNetSql\Quotes.Quotations"), Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.[Default], onRemoveCallback)
    End Sub
End Class

甚至像这样:

Public Class Foo
    Private WithEvents timScheduledTask As System.Timers.Timer

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        timScheduledTask = New System.Timers.Timer
        timScheduledTask.Interval = 600 * 1000 //in milliseconds    
        timScheduledTask.Enabled = True
        timScheduledTask.Start()  
    End Sub

    Protected Sub MyHelper(ByVal sender As Object, ByVal e As EventArgs) Handles timScheduledTask.Elapsed
        Dim ds As DataSet = obj1.Dataset()

        Dim onRemoveCallback As CacheItemRemovedCallback

        _cache.Insert("ResultDataset", ds, New CacheDependency("C:\AspNetSql\Quotes.Quotations"), Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.[Default], onRemoveCallback)
    End Sub
End Class
于 2012-07-18T14:27:06.683 回答
0

代码必须看起来像这样。
但是我们必须牢记在心。如果您将间隔设置为 50 秒,则每秒钟代码执行应在起始标记行下方的断点处停止,即 _cache.insert。

Class Foo  
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

        //Caching the Dataset for every mentioned time interval
        _cache = Context.Cache
        Dim timer As New System.Timers.Timer()
        timer.Interval = 50 * 1000 //in milliseconds = 50Seconds   
        timer.Enabled = True

        //Automatically calling the GetMetricsDataset mothod for every mentioned time interval
        AddHandler timer.Elapsed, AddressOf Me.GetDataset

        timer.Stop()
        timer.Start()

    End Sub

    Private Function GetDataset(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) As DataSet
        Dim ds As DataSet = obj1.GetDataset()

        Dim onRemoveCallback As CacheItemRemovedCallback

        **_cache.Insert("Dataset", ds, New CacheDependency("C:\AspNetSql\Quotes.Quotations"), Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.[Default], _
         onRemoveCallback)**

        Return ds
    End Function
End
于 2012-07-18T17:35:59.940 回答