处理来自继承类的事件

时间:2016-01-20 03:18:48

标签: vb.net multithreading events inheritance

我创建了一个继承类的对象。其中一个事件是触发列表中的更改。我试着写一个例子,但我发现放下逻辑要容易得多。通过"事件被提出",我的意思是 Private Sub RequestReceived(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.RequestReceived 'RequestReceived is from the Base Class Dim requestType As String = sender If requestType = "Type1" Then RequestIsVariantOne(sender) Else Then 'Handle other variants similarly End If End Sub Private Sub RequestIsVariantOne(ByVal sender As Object) 'Conditional statements go here that determine whether or not to edit the list 'The statements will exit the Sub if it the list should not be edited. 'If Sub hasn't exited yet, now we edit the list. ThatList.Add(sender) 'ListChanged is from the Inherited class RaiseEvent ListChanged(ThatList, Nothing) End Sub 。这也是我第一次使用自定义事件和可继承的类。

  1. 创建继承类的对象(在其自己的线程中
  2. Inherited Class运行MyBase.New()
  3. 基类开始侦听传入的请求
  4. 如果收到请求且有效,则引发基类的事件,该事件由继承类处理(此事件可能会修改列表)
  5. 如果更改了列表,则会引发来自Inherited Class的事件并由GUI处理
  6. 基类返回等待新请求
  7. 我试图避免从继承的类编辑GUI。问题是事件永远不会触发(它忽略了步骤5中的RaiseEvent,并且GUI永远不会发生事件)。可能单独的线程是个问题吗?

    步骤5的示例:

    resource

1 个答案:

答案 0 :(得分:0)

Private Sub ToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripMenuItem.Click
        Dim rT As New Threading.Thread(AddressOf ListenerThread)
        rT.Start()
    End If
End Sub

Private Sub ListenerThread()
    r = New RequestListener()
    *r.Listen()*
End Sub

在星号中,这是关键因素。最初,它是从继承类的构造函数调用的。这意味着从未返回到GUI,我的类级变量从未更新过。因此,对RequestListener(特别是事件)的任何引用都不会触发,因为RequestListener是Nothing 。从GUI调用它解决了r IS Nothing问题。

我通过创建一个手动提升事件的按钮来发现这一点,但是受到了NullReferenceException的欢迎。一旦我从GUI启动了我的监听器,就会触发处理我的自定义事件的方法。我认为这解决了我的问题,但需要更多的工作。