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

问题描述 投票:1回答:1

需要以下帮助。预先感谢。

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

现在,当我要将这些电子邮件存储在数据库中时,我不想在该线程中而是在父类的线程中进行该处理。我该怎么做?我知道InvokeRequired和Invoke可以在窗体控件上完成,但这不是窗体,而是一个类。

例如:代码为:

我的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
 'Retrieve the messages and store them in DB
End Sub
End Class
.net vb.net multithreading events mailkit
1个回答
0
投票

您可以使用AddHanlder手动分配处理程序>

使用一个简单的例子。引发事件的类:

Public Class ClassDoingWork
    Public Event NewMessage()

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

和一个使用此工作程序类的类,在新线程上调用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
© www.soinside.com 2019 - 2024. All rights reserved.