Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 线程:从单独的线程调用代理(VS2010)_Vb.net_Multithreading_Oop - Fatal编程技术网

Vb.net 线程:从单独的线程调用代理(VS2010)

Vb.net 线程:从单独的线程调用代理(VS2010),vb.net,multithreading,oop,Vb.net,Multithreading,Oop,所以,我在实现一个单独的线程时遇到了问题。这是因为我有一个简单的类,在其中我开始了一个新的线程。因此,由于它不是任何形式,我还没有找到任何方法让它在UI线程中调用函数 因此,我不能使用Invoke方法。有没有办法从另一个线程调用函数?尝试公开类中的一些事件,在需要通知UI时触发它们,最后让UI组件注册这些事件, 触发事件时,将执行侦听器方法。在那里,您可以使用Control.Invoke或Control.BeginInvoke在UI线程上执行代码。我假设您的类中公开了事件,并且希望事件处理程序在

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


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

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

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

实现这一点的一种方法是让类接受一个
ISynchronizeInvoke
实例<代码>表单和
控件
实例实现此接口,因此可以使用其中一个实例的引用。您可以约定,如果未指定实例,则通过在类上引发事件执行的事件处理程序将在工作线程中执行,而不是在承载
ISynchronizeInvoke
实例(通常是表单或控件)的线程中执行


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

为什么不能在控件上调用
Invoke
BeginInvoke
?因为我没有任何控件。是我正在开发的图书馆。:)如果需要在创建控件的线程上调用委托,则必须确定该线程是哪个线程。最简单的方法是让库的使用者将对控件的引用传递给对象的构造函数或设置属性。
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