Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类实例将消息返回表单的最佳方法?_C#_.net_Winforms_Class_Message Queue - Fatal编程技术网

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

C# 从类实例将消息返回表单的最佳方法?,c#,.net,winforms,class,message-queue,C#,.net,Winforms,Class,Message Queue,我想知道是否有人能帮我 我正在使用一个mqapi,特别是“监听”部分,在这里我连接到一个队列,等待接收消息 我使用Winforms应用程序C#.NET 3.5来处理此API 要使用API,我必须创建如下实例: private void btnConnect(object sender, EventArgs e) { MessageQueue myMQ = new MessageQueue(); myMQ.Connect(...); //Register handler

我想知道是否有人能帮我

我正在使用一个mqapi,特别是“监听”部分,在这里我连接到一个队列,等待接收消息

我使用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继承):

如您所见,从MQ.MessageListener继承允许我重写onMessage()方法,而每当在该队列上收到消息时,就会触发该方法

由于这种情况在后台悄无声息地发生,我不确定将消息文本返回到创建类实例的表单的最佳方法是什么,而不是将MsgBody输出到控制台。我从不调用onMessage(),它是被触发的,因此我无法将值返回到表单

更新

我添加了一个eventhandler,将接收到的消息传递回用户表单,方法PassMessage()将消息写到控制台

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

myMQ.onMessage(Pass in a message);
但是。。如果我向队列发送一条真实消息,并等待MQ类中的onMessage()方法被触发并接收该消息,它确实会接收该消息,但我的eventhandler不会被触发

有人知道为什么会这样吗


有什么想法吗?谢谢。

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

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

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

查看EventsUp将您自己的事件添加到MessageQueue类,并在onMessage处理程序中提升它。然后将事件处理程序添加到表单中新创建的事件中。哦,顺便问一下,你上了什么课?我现在正在使用MQ,这对我很有帮助。我在
System.Messaging
中找不到
MessageListener
。您使用的是哪种API?大家好,这是我们购买的MQ平台,但它没有太多的.NET兼容性。我已经更新了我的代码,以显示我根据建议添加的EventHandler(感谢您的建议),但事件似乎从未触发?有人能看出我做错了什么吗?如何通过处理程序将消息文本传递回表单?谢谢消息处理人员为什么应该知道表单?我同意这将为OP提供在表单上输出文本的能力,但我认为事件将是一个更好的选择,不是吗?将显示消息的行为与接收消息的行为分离。您好,谢谢您的建议。我更愿意通过eventhandler将消息传递回我的表单,而不是让类知道我的表单。再次感谢。真的,我在征求关于将收到的消息传递回表单的最佳方式的建议,而不必让全班直接知道表单的存在:)
public void passMessage(object s, EventArgs e)
{
   txtMessage.Invoke(delegate()
   {
      txtMessage.Text = "";
   });
}