所以,我在实现一个单独的线程时遇到了麻烦。这是因为我有一个简单的类,在其中我开始一个新的线程。所以,因为它不是任何形式,我没有找到任何方法让它调用UI线程中的函数。
所以,我不能使用Invoke
方法。有没有办法从另一个线程调用函数?
答案 0 :(得分:0)
尝试在类中公开某些事件,在需要通知UI时触发它们,最后让UI组件注册到这些事件, 触发事件时,将执行侦听器方法。你可以使用Control.Invoke或Control.BeginInvoke在UI线程上执行代码。
答案 1 :(得分:0)
我将假设您从类中暴露了事件,并且您希望事件处理程序在UI线程上执行。我想你可以有一个调用者指定的回调。无论哪种方式,我将在下面描述的模式将适用于两种情况
实现此目标的一种方法是让您的班级接受ISynchronizeInvoke
个实例。 Form
和Control
个实例实现此接口,因此可以使用对其中一个的引用。如果未指定实例,则可以使其成为约定,然后通过在类上引发事件来执行的事件处理程序将在工作线程中执行,而不是在托管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
首先要注意的是,您不必指定同步对象。这意味着您不必拥有Form
或Control
引用。如果未指定,则会在工作线程上引发SomeEvent
。这与System.Timers.Timer
类中使用的模式相同。