【问题标题】:Addhandler and AddressOf in .net.net 中的 Addhandler 和 AddressOf
【发布时间】:2012-07-18 14:21:04
【问题描述】:

您好,我正在尝试编写以下代码来触发 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

【问题讨论】:

  • 仅供参考,Enabled = True.Start() 是等效的。
  • @Marc,我也厌倦了你的建议。但是没有用。
  • 简单的解释是它确实会触发,但你只是看不到它。在“输出”窗口中查找任何“第一次机会”异常通知。使用 Debug + Exceptions, Throw 复选框对其进行调试。

标签: .net addhandler


【解决方案1】:

您的问题是timScheduledTaskApplication_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

【讨论】:

  • 这不适用于启用的计时器。虽然这是一个直观的答案,但计时器的某些因素使其不正确stackoverflow.com/questions/4959149/…
  • 哈。我不知道。好的。那么仍然可能是由于未初始化 onRemoveCallback 引起的问题。但这不能确定,因为我不知道 _cache 的类是什么。
  • @Nitram,我用你上面的两个代码试过了。我们必须使用 Private WithEvents timScheduledTask As New System.Timers.Timer 以避免错误“System.NullReferenceException:对象引用未设置为对象的实例。”在行 timScheduledTask.Interval = 600 * 1000.
  • @Nitram,我上面的代码看起来 timScheduledTask 没有消失。因为。如果 timScheduledTask.Elapsed,它应该在我们使用第二个代码时触发该方法。
  • 只是一个疯狂的猜测:尝试用 ElapsedEventArgs 替换处理函数的 EventArgs
【解决方案2】:

代码必须是这样的。
但是我们必须牢记在心。如果将间隔设置为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多