将消息从类实例返回到表单的最佳方式

本文关键字:表单 最佳 方式 返回 消息 实例 | 更新日期: 2023-09-27 18:19:08

我想知道是否有人可以帮助我…

我正在使用MQ API,特别是"侦听"部分,我已经连接到队列,正在等待接收消息。

我使用一个Winforms应用程序,c# . net 3.5来使用这个API。

要使用这个API,我必须创建这样一个实例:

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
}

实现了这个类(这个类又继承了MessageListener):

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);
        }
    }
}

如您所见,从MQ继承。MessageListener允许我重写onMessage()方法,该方法在每次从该队列接收消息时触发。

由于这在后台默默地发生,我不确定将消息文本返回到创建类实例的表单的最佳方法是什么,而不是将MsgBody输出到控制台。我从来没有调用过onMessage(),它被触发了,所以我不能返回一个值给表单。

更新

我添加了一个事件处理程序,将收到的消息传递回用户表单,其中PassMessage()方法将消息写入控制台。

奇怪的是,当我手动发送消息到onMessage从我的表单(不通过MQ)即下面,这似乎工作和处理程序触发passMessage()在我的表单。

myMQ.onMessage(Pass in a message);

但. .如果我发送一个真正的消息到队列,并等待我的MQ类中的onMessage()方法被触发并接收消息,它确实接收消息,但我的eventandler没有被触发。

有人知道为什么会发生这种情况吗?

任何想法?谢谢。

将消息从类实例返回到表单的最佳方式

要发送消息到您的表单,您需要使用Invoke方法管理您的消息在表单的头部使用,其他线程不能传递消息到表单。

我修改了你的代码:

public void passMessage(object s, EventArgs e)
{
   txtMessage.Invoke(delegate()
   {
      txtMessage.Text = "";
   });
}