我想知道是否有人可以帮助我......
我正在使用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()方法被触发并接收消息,它确实收到了消息,但我的事件处理程序没有被触发。
有谁知道为什么会发生这种情况?
有什么想法吗?感谢。
答案 0 :(得分:1)
要向表单发送消息,您需要使用Invoke
方法管理要在表单的thead中使用的消息,其他线程无法将消息传递给表单。
我更改了有关如何操作的代码:
public void passMessage(object s, EventArgs e)
{
txtMessage.Invoke(delegate()
{
txtMessage.Text = "";
});
}