从类实例返回消息返回表单的最佳方法?

时间:2014-08-21 13:07:24

标签: c# .net winforms class message-queue

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

我正在使用MQ API,特别是“Listening”部分,我已连接到Queue,我正在等待接收消息。

我正在使用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(),它被触发,所以我不能将值重新返回到表单。

更新

我已在eventhandler中添加了将收到的消息传递回用户表单,其中PassMessage()方法将消息写入控制台。

奇怪的是,当我从我的表单(而不是通过MQ)手动向onMessage发送消息时,这似乎有效,处理程序在我的表单上触发passMessage()。

myMQ.onMessage(Pass in a message);

但是..如果我向队列发送一条真实的消息并等待我的MQ类中的onMessage()方法被触发并接收消息,它确实收到了消息,但我的事件处理程序没有被触发。

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

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

要向表单发送消息,您需要使用Invoke方法管理要在表单的thead中使用的消息,其他线程无法将消息传递给表单。

我更改了有关如何操作的代码:

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