如何从子线程(无UI)在vb.net中的父线程中触发事件

时间:2015-08-26 11:14:53

标签: .net vb.net multithreading events mailkit

会请求以下帮助。在此先感谢:

我正在尝试使用vb.Net中的MailKit Imap客户端创建一个邮件客户端。 Mailkit Imap客户端处于空闲模式,当新邮件到达时,它会引发一个自己的线程中的事件。

现在,当我想将这些电子邮件存储在数据库中时,我希望不在该线程中进行处理,而是在我父类的线程中进行。我如何实现这一目标?我知道InvokeRequired和Invoke可以在Form Controls上完成,但这不是一个表单,它是一个类。

例如:代码是:

我的ImapMonitor类有一个事件:

Class ImapMonitor

Private Sub rFolder_MessageArrived(sender as object, e as MailkitMessagesArrivedEventArgs) handles rfolder.MessagesArrived
   RaiseEvent NewMessages(param1,param2)
End Sub

End Class

Class MailChecker
'My Main class which creates an object of ImapMonitor class goes :

Dim withevents iMonitor as ImapMonitor

Private Sub iMonitor_NewMessages(param1,param2) handles ImapMonitor.NewMessages 'this event is not in MailCheckers thread
 'Retreieve the messages and store them in DB
End Sub
End Class

1 个答案:

答案 0 :(得分:0)

您可以使用AddHanlder

手动分配处理程序

使用一个简单的例子。正在举办活动的班级:

Public Class ClassDoingWork
    Public Event NewMessage()

    Public Sub DoWork()
        RaiseEvent NewMessage()
    End Sub
End Class

使用此worker类的类,在新线程上调用DoWork并订阅NewMessage事件:

Public Class ClassMonitoringThread
    Public Sub New()
        Dim workerThread As New ClassDoingWork
        AddHandler workerThread.NewMessage, AddressOf NewMessageEvent
        Dim thr As New Thread(Sub() workerThread.DoWork())
        thr.Start()
    End Sub

    Public Sub NewMessageEvent()
        MessageBox.Show("New Message")
    End Sub
End Class