Esempio n. 1
0
        static void Main(string[] args)
        {
            string path = @".\private$\test";

            if (MessageQueue.Exists(path))
            {
                MessageQueue.Delete(path);
            }
            //创建一个消息队列 并发送
            MessageQueue msq = MessageQueue.Create(path);//指定现有的资源链接路径

            /*
             * MessageQueue 类提供对“消息队列”队列的引用。可以在 MessageQueue 构造函数中指定一个连接到现有资源的路径,
             * 或者可在服务器上创建新队列。在调用 Send(Object)、Peek 或 Receive 之前,
             * 必须将 MessageQueue 类的新实例与某个现有队列关联。此时,可操作该队列的属性,如 Category 和 Label。
             * MessageQueue 支持两种类型的消息检索:同步和异步。同步的 Peek 和 Receive 方法使进程线程用指定的间隔时间等待新消息到达队列。
             * 异步的 BeginPeek 和 BeginReceive 方法允许主应用程序任务在消息到达队列之前,在单独的线程中继续执行。这些方法通过使用回调对象和状态对象进行工作,以便在线程之间进行信息通信。
             * 当创建 MessageQueue 类的新实例时,并不是要创建新的“消息队列”队列。而是可使用 Create(String)、Delete 和 Purge 方法管理服务器上的队列。
             * 与 Purge 不同,Create(String) 和 Delete 是 static 成员,因此可以调用它们而无需创建 MessageQueue 类的新实例。
             * 可以使用以下三种名称之一设置 MessageQueue 对象的 Path 属性:友好名称、FormatName 或 Label。友好名称由队列的 MachineName 和 QueueName 属性定义,
             * 对于公共队列为 MachineName\QueueName,对于专用队列为 MachineName\Private$\QueueName。FormatName 属性允许对消息队列进行脱机访问。
             * 最后,可使用队列的 Label 属性设置队列的 Path。
             * 有关 MessageQueue 的实例的初始属性值列表,请参见 MessageQueue 构造函数。
             *
             * 对于多线程操作,只有以下方法是安全的:BeginPeek、BeginReceive、EndPeek、EndReceive、GetAllMessages、Peek 和 Receive。
             */
            msq.Send(8);
            msq.Send("Kiba518");

            Mathes mm = new Mathes();

            msq.Send(mm);
            msq.Send(mm);

            //出队
            ((XmlMessageFormatter)msq.Formatter).TargetTypes = new Type[] { typeof(System.Int32) };
            Message m1 = msq.Receive();

            Console.WriteLine(m1.Body.ToString());

            ((XmlMessageFormatter)msq.Formatter).TargetTypes = new Type[] { typeof(System.String) };
            Message m2 = msq.Receive();

            Console.WriteLine(m2.Body.ToString());

            ((XmlMessageFormatter)msq.Formatter).TargetTypes = new Type[] { typeof(Mathes) };
            Message m3 = msq.Receive();

            Console.WriteLine(mm.SumAB(10, 20));

            #region 异步

            ((XmlMessageFormatter)msq.Formatter).TargetTypes = new Type[] { typeof(Mathes) };
            msq.BeginReceive(new TimeSpan(10000), msq, new AsyncCallback(MySum));

            #endregion

            Console.Read();
        }
Esempio n. 2
0
        static void MySum(IAsyncResult ia)
        {
            MessageQueue msq = ia.AsyncState as MessageQueue;

            Message m4 = msq.EndReceive(ia);

            Mathes mm = m4.Body as Mathes;

            Console.WriteLine(mm.SumAB(25, 35));
        }