带有Sender和Receiver类的c#中的MSMQ

时间:2013-07-19 10:21:43

标签: c# msmq

好吧,我再次挣扎着一些代码,但它不起作用。 基本上,我有一个简单的学生班,名字,姓氏和组号:

[XmlRoot]
    public class Student
    {
        string name;
        string surname;
        int group;

        public Student(string _name, string _surname, int _group)
        {
            name= _name;
            surname= _surname;
            group= _group;
        }

        public Student()
        {
        }

        public void writeAttributes()
        {
            Console.WriteLine("{0}{1}{2}",name, surname, group);
        }
    }

然后,我在Visual Studio中的解决方案有两个项目:一个是发件人,另一个是接收者。 我想要完成的是通过MSMQ(异步)发送此类的实例。 这是发件人代码:

class Program
    {
        static MessageQueue mq;

        static void SendMessage(object sender, EventArgs e)
        {
            System.Messaging.Message msg = new System.Messaging.Message();

            try
            {
                msg.Label = "Message Label";

                mq.Send(new Student("Name", "Surname", 1000));
                Console.WriteLine("We send a Student");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        static void Main(string[] args)
        {
            Timer timer1 = new Timer();           

            if (MessageQueue.Exists(@".\private$\NewPrivateQ"))
                mq = new MessageQueue(@".\private$\NewPrivateQ");
            else
                mq = MessageQueue.Create(@".\private$\NewPrivateQ");    

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Student) });

            //init the timer
            System.Timers.Timer myTimer = new System.Timers.Timer();
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(SendMessage);
            myTimer.Interval = 3000;
            myTimer.Enabled = true;

            while (true) ;
        }
    }

我使用计时器,每隔3秒发送一次信息。 而且,这是接收者代码:

class Program
    {
        static void OnMessageArrival(IAsyncResult ar)
        {
            MessageQueue mq = (MessageQueue)ar.AsyncState;

            try
            {
                Message msg = mq.EndReceive(ar);

                var message = (Student)msg.Body;
                //Console.WriteLine(message);
                message.writeAttributes();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);                
            }
            finally
            {
                mq.BeginReceive(TimeSpan.FromSeconds(5), mq,
                new AsyncCallback(OnMessageArrival));
            }
        }

        static void Main(string[] args)
        {
            MessageQueue mq = new MessageQueue(@".\private$\NewPrivateQ");

            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Student) });

            while (true)
            {
                try
                {
                    IAsyncResult iar = mq.BeginReceive(TimeSpan.FromSeconds(5), mq, new AsyncCallback(OnMessageArrival));                   
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

我什么都没收到。我尝试了很多方法。我试图将XmlFormatter更改为BinaryFormatter,但没有成功。

另一个有用的信息:它包含在两个项目中的学生课程:发件人和接收者。

1 个答案:

答案 0 :(得分:1)

XmlSerializer不支持序列化私有字段,因此要使用此属性,您需要使用public属性。

如果您需要该级别的序列化控制,您应该查看DataContractSerializer