2016-01-20 118 views
0

我创建了继承类的对象。其中一个事件是在列表中发起更改。我试着写了一个例子,但我发现放下我的逻辑要容易得多。 “发生事件”的意思是RaiseEvent。这也是我第一次使用自定义事件和可继承的类。处理来自继承类的事件

  1. (在自己的线程
  2. 继承类运行MyBase.New()
  3. 基地班开始监听传入的请求
  4. 如果收到请求,并有效创建继承类的对象,引发基类的事件,由继承类处理(此事件可能会修改列表)
  5. 如果列表发生更改,则会引发继承类的事件并由GUI处理
  6. 基类返回等待新请求

我试图避免从继承类编辑GUI。问题是事件永远不会触发(它忽略了第5步中的RaiseEvent,并且GUI从未获得事件)。可能单独的线程是一个问题?

步骤5的实施例:

  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 
+0

有关OOP(继承,事件)的概念不与多线程连接,它讲述了数据结构如何组织的想法。正如我认为的,这是沿着多线程问题调查您的问题的错误方法。您是否介意发布一些代码来演示step5事件如何引发? –

+0

所以你说的只是我的问题与线程无关?当然,我会发布一些东西。 –

+0

有了类听自己的事件就没有什么意义了。改用虚拟方法,使用Overridable和Overrides关键字。 –

回答

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启动侦听器,处理我的自定义事件的方法就被触发了。我认为这解决了我的问题,但需要更多的工作。