事件处理程序不在类方法上触发

时间:2014-08-22 13:17:19

标签: c# .net class events event-handling

我在类中有一个似乎没有触发的事件处理程序。我想知道是否有人对于为什么会发生这种情况有任何想法(或者不会发生这种情况)。

该类继承自另一个类,基本上侦听来自消息队列的消息。当消息到达队列时,将调用onMessage()方法。

从我的(winforms,c#,。net 3.5)用户界面表单中,我试图将收到的消息返回给用户界面。

如果我从表单上的实例手动调用onMessage()方法,则eventhandler会正确触发,并且在我的UI表单上执行passMessage。

但是当我收到一条消息来自我正在侦听的队列中自动生成时,事件处理程序不会被触发。我不会调用onMessage()方法,这会自动发生。

当我每次收到消息时调用onMessage()时,有没有人知道为什么事件处理程序没有触发?

由于

UI:

private void btnConnect(object sender, EventArgs e)
{
    MessageQueue myMQ = new MessageQueue();
    myMQ.Connect(...);
    //Register handler
        myMQ.MsgTrigger += new EventHandler(passMessage);
}

public void passMessage(object s, EventArgs e)
{
    Console.WriteLine(s.ToString()); //Not sure if this is a good way to pass back a value
}

类别:

namespace MQListener
{
    class MessageQueue : MQ.MessageListener
    {
        public event EventHandler MsgTrigger;

        public virtual void onMessage(MQ.Message Message)
        {
            MQ.TextMessage txtMessage = (MQ.TextMessage)Message;
            String MsgBody = txtMessage.getMessage();
            Console.WriteLine(MsgBody);

            object objMsg = (object)MsgBody;

            var _Trigger = MsgTrigger;

                if(_Trigger != null)
                   _Trigger(objMsg, null);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  1. 您的活动订阅应该在您连接之前进行:

    private void btnConnect(object sender, EventArgs e)
    {
        MessageQueue myMQ = new MessageQueue();
        //Register handler
        myMQ.MsgTrigger += new EventHandler(passMessage);
        myMQ.Connect(...);
    }
    
  2. 您只能从UI线程更新控件,因此为了防止错误“'txtMessage'从其创建的线程以外的线程访问。”,您需要检查控件的{{1}属性。如果为true,则需要调用InvokeRequired方法。请参阅此问题:Automating the InvokeRequired code pattern