none
Timers.Timer.SynchronizingObject 怎么设置? RRS feed

  • 问题

  • 找了半天没找到关于 SynchronizingObject 属性设置的说明和例子。有 C# 的,写的是 SynchronizingObject=this ,但在 VB 里我写 SynchronizingObject=Me 的话,显示错误。说 SynchronizingObject 属于 ComponentModel.ISynchronizeInvoke ,而 Me 无法转换成 ISynchronizeInvoke 。那这个 SynchronizingObject 到底应该怎么设置呢?
    2010年8月25日 16:19

答案

  • Class MainWindow 
      Private WithEvents T As New Timers.Timer
    
      Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    
        T.AutoReset = True
        T.Enabled = True
        T.Interval = 500
    
        T.Start()
    
      End Sub
    
      Private Sub T_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles T.Elapsed
    
        TextBox1.Dispatcher.Invoke(New Action(AddressOf SetText))
    
      End Sub
     
    
      Private Sub SetText()
        TextBox1.Text = Now.ToString
      End Sub
    
    End Class
    

    http://feiyun0112.cnblogs.com/
    • 已标记为答案 sxin 2010年8月27日 5:29
    2010年8月27日 3:34
    版主

全部回复

  • 我试了没问题,你是把代码放到form里面吗
    http://feiyun0112.cnblogs.com/
    2010年8月26日 2:36
    版主
  • 不好意思,忘说了,是WPF,不是WinForm,WinForm没问题的。
    2010年8月26日 6:13
  • 没太明白,请版主继续指教一下。是说设置SynchronizingObject = CType(Me.Dispatcher, ComponentModel.ISynchronizeInvoke)么?可是不行啊?比如这样:

    Private WithEvents T As New Timers.Timer
    
    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
     T.SynchronizingObject = CType(Me.Dispatcher, ComponentModel.ISynchronizeInvoke)
     T.AutoReset = True
     T.Enabled = True
     T.Interval = 500
     T.Start()
    End Sub
    
    Private Sub T_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles T.Elapsed
     textBox1.Text = Now.ToString
    End Sub
    

    虽然没报错,但根本不运行啊。如果像下面这样就没问题。

    Private WithEvents FT As New Forms.Timer
    
    Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
     FT.Interval = 500
     FT.Start()
    End Sub
    
    Private Sub FT_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles FT.Tick
     textBox1.Text = Now.ToString
    End Sub
    

    Timers.Timer应该是WPF的常用计时器吧,Forms.Timer还需要引用Forms,可这个Timers.Timer怎么在WPF里这么麻烦呢,请版主继续帮忙想办法,谢谢。

    2010年8月26日 10:37
  • Class MainWindow 
      Private WithEvents T As New Timers.Timer
    
      Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    
        T.AutoReset = True
        T.Enabled = True
        T.Interval = 500
    
        T.Start()
    
      End Sub
    
      Private Sub T_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles T.Elapsed
    
        TextBox1.Dispatcher.Invoke(New Action(AddressOf SetText))
    
      End Sub
     
    
      Private Sub SetText()
        TextBox1.Text = Now.ToString
      End Sub
    
    End Class
    

    http://feiyun0112.cnblogs.com/
    • 已标记为答案 sxin 2010年8月27日 5:29
    2010年8月27日 3:34
    版主
  • 谢谢指教,这个可以了,原来SynchronizingObject属性在WPF里不能用啊。
    2010年8月27日 5:28