线程:从一个单独的线程调用委托(VS2010)

时间:2011-06-10 20:52:20

标签: vb.net multithreading oop

所以,我在实现一个单独的线程时遇到了麻烦。这是因为我有一个简单的类,在其中我开始一个新的线程。所以,因为它不是任何形式,我没有找到任何方法让它调用UI线程中的函数。

所以,我不能使用Invoke方法。有没有办法从另一个线程调用函数?

2 个答案:

答案 0 :(得分:0)

尝试在类中公开某些事件,在需要通知UI时触发它们,最后让UI组件注册到这些事件, 触发事件时,将执行侦听器方法。你可以使用Control.Invoke或Control.BeginInvoke在UI线程上执行代码。

答案 1 :(得分:0)

我将假设您从类中暴露了事件,并且您希望事件处理程序在UI线程上执行。我想你可以有一个调用者指定的回调。无论哪种方式,我将在下面描述的模式将适用于两种情况

实现此目标的一种方法是让您的班级接受ISynchronizeInvoke个实例。 FormControl个实例实现此接口,因此可以使用对其中一个的引用。如果未指定实例,则可以使其成为约定,然后通过在类上引发事件来执行的事件处理程序将在工作线程中执行,而不是在托管ISynchronizeInvoke实例的线程(通常是表单或控件)中执行。

Public Class YourClass
  Private m_SynchronizingObject As ISynchronizeInvoke = Nothing

  Public Sub New(ByVal synchronizingObject As ISynchronizeInvoke)
    m_SynchronizingObject = synchronizingObject
  End Sub

  Public Property SynchronizingObject As ISynchronizeInvoke
    Get
      Return m_SynchronizingObject
    End Get
    Set(ByVal value As ISynchronizeInvoke)
      m_SynchronizingObject = value
    End Set
  End Property

  Private Sub SomeMethodExecutingOnWorkerThread()
    RaiseSomeEvent()
  End

  Private Sub RaiseSomeEvent()
    If Not SychronizingObject Is Nothing AndAlso SynchronizingObject.InvokeRequired Then
      SynchronizingObject.Invoke(New MethodInvoker(AddressOf RaiseSomeEvent)
    End If
    RaiseEvent SomeEvent
  End Sub

End Class

首先要注意的是,您不必指定同步对象。这意味着您不必拥有FormControl引用。如果未指定,则会在工作线程上引发SomeEvent。这与System.Timers.Timer类中使用的模式相同。