c# - 从类实例将消息返回到表单的最佳方法?

标签 c# .net winforms class message-queue

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

我正在使用 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() 将消息写出到控制台。

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

myMQ.onMessage(Pass in a message);

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

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

有什么想法吗?谢谢。

最佳答案

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

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

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

关于c# - 从类实例将消息返回到表单的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25427153/

相关文章:

c# - 通过C#读取SQL Server中存储过程设置的值

c# - C# 和 C++ 中的可选参数

c# - 比较 LINQ to SQL 中的两个日期

c# - 将项目更新到实体核心 5 后出现 Microsoft.EntityFrameworkCore.Query.IParameterValues 错误

c# - 使用 PathGradientBrush 创建的阴影显示出不需要的刺结果

c# - 如何处理资源 (.resx) 文件中的字符串文字

c# - 将无穷大数学行为添加到 Decimal

c# - 我可以检测到垃圾收集在 .NET 中运行的时刻吗?

c# 删除列表框的键

c# - 如何在不使用 GroupBox 的情况下为单选按钮赋值并确定选定的单选按钮