我在类中有一个似乎没有触发的事件处理程序。我想知道是否有人对于为什么会发生这种情况有任何想法(或者不会发生这种情况)。
该类继承自另一个类,基本上侦听来自消息队列的消息。当消息到达队列时,将调用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);
}
}
}
答案 0 :(得分:1)
您的活动订阅应该在您连接之前进行:
private void btnConnect(object sender, EventArgs e)
{
MessageQueue myMQ = new MessageQueue();
//Register handler
myMQ.MsgTrigger += new EventHandler(passMessage);
myMQ.Connect(...);
}
您只能从UI线程更新控件,因此为了防止错误“'txtMessage'从其创建的线程以外的线程访问。”,您需要检查控件的{{1}属性。如果为true,则需要调用InvokeRequired
方法。请参阅此问题:Automating the InvokeRequired code pattern