在多线程类中引发事件?

时间:2009-08-27 09:43:24

标签: vb.net visual-studio-2005

在多线程类中引发事件?

我正在运行一个类(游戏手柄处理程序),它使用许多子线程来检查键输入等,然后它将事件引发到我的表单以解决所需的反应,是否有办法使事件在与类本身相同的线程。

3 个答案:

答案 0 :(得分:6)

最简单的答案是,“只是在当前线程上引发事件。”由表单处理事件然后使用Control.Invoke在表单的线程上执行任何更新。

以下是从另一个帖子更新名为Label的{​​{1}}控件的推荐方法。

将以下代码添加到表单

__message

然后根据需要调用表单 Delegate Sub SetTextDelegate(ByVal message As String) Public Sub SetText(ByVal message As String) If __message.InvokeRequired Then Dim oCall As New SetTextDelegate(AddressOf SetText) Me.Invoke(oCall, New Object() {message}) Else __message.Text = message End If End Sub

您可以使用.SetText(<messageToDisplay>)Control.Invoke方法。有关详细信息,请参阅Control.BeginInvoke属性。

答案 1 :(得分:0)

你的意思是,在主线程而不是子线程上引发事件?如果是这样,那么正确的方法是将事件排入主线程并让主线程处理队列。基本上,需要编写主线程来处理队列。一个典型的例子,如果像这样的东西是windows ui线程中的消息处理。

如果这与您的情况相同,那么您应该向UI消息泵发送消息。

答案 2 :(得分:0)

如果在从另一个线程调用事件时如何处理GUI线程上的任何事件(对C#代码感到遗憾,但它应该很容易翻译):

void myEventHandler(object sender, EventArgs e) 
{
    if (this.InvokeRequired) 
    { 
        this.BeginInvoke(new MethodInvoker(delegate() { myEventHandler(sender,e); }));   
        return; 
    } 

    // write code to handle event here 

}

备用语法:

if (this.InvokeRequired) 
{ 
    this.BeginInvoke((MethodInvoker)delegate
    {
       myLabel.Text = "What a great post";
    });
}