//check is existed and create
if (MessageQueue.Exists(@".\Private$\MSMQtest") == false)
{
    MessageQueue.Create(@".\Private$\MSMQtest", true);
}
---------------------------------------------------------------------------
 //根据机器名字取得所有的队列数组
MessageQueue[] qs = MessageQueue.GetPrivateQueuesByMachine("127.0.0.1");

---------------------------------------------------------------------------
//获取MSMQ所在的机器GUID号 
Guid g= MessageQueue.GetMachineId("127.0.0.1");//工作组安装计算机不支持该操作
---------------------------------------------------------------------------
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到    
System.Messaging.Message message = queue.Receive();

---------------------------------------------------------------------------            
q =MessageQueue.GetPublicQueues();//工作组安装计算机不支持该操作
---------------------------------------------------------------------------
MessageQueue queue = new MessageQueue(@".\Private$\MSMQtest");
//queue.AccessMode默认值=QueueAccessMode.SendAndReceive
//Peek     队列仅可以查看消息。 
//PeekAndAdmin     队列可以查看消息。消息也可以被清除。 
//Receive     队列可以查看或接收消息。 
//ReceiveAndAdmin     队列可以接收消息。消息也可以被清除。 
//Send     队列仅可以发送消息。 
//SendAndReceive     队列可以查看、接收或发送消息。 
---------------------------------------------------------------------------
Guid g = queue.Category;
Console.WriteLine(g.ToString());
---------------------------------------------------------------------------
//DenySharedReceive 指定此 MessageQueue 引用的队列的共享模式。
//将 DenySharedReceive 设置为 true,以指示只有此 MessageQueue 应具有通过指定的 Path 查看或接收来自队列的消息的访问权。
//如果另一个 MessageQueue 或另一个应用程序与同一队列资源关联,则该实例或应用程序将无法查看或接收消息,但它仍可发送消息。
//如果 DenySharedReceive 为 false,则队列可供多个应用程序用来发送、查看或接收消息。
bool b = queue.DenySharedReceive;

---------------------------------------------------------------------------
Message myMessage1 = new Message("test", new BinaryMessageFormatter());
Message myMessage2 = new Message("test", new XmlMessageFormatter());
Message myMessage3 = new Message(new people() { age = 100, name = "cdd" }, new BinaryMessageFormatter());

queue.Send(myMessage1);
queue.Send(myMessage2);
queue.Send(myMessage3);

发送message的时候,指定的Formatter,在receive的时候也需要设置queue.Formatter,比如queue.Formatter = new BinaryMessageFormatter();
---------------------------------------------------------------------------
 queue.Receive()会删除当前消息。
 queue.Peek()不会删除当前消息。
---------------------------------------------------------------------------
 ///判断queue是不是空了。
static public bool IsQueueEmpty(MessageQueue myQueue)
        {
            bool isQueueEmpty = false;

// Connect to a queue.
            //MessageQueue myQueue = new MessageQueue(".\\myQueue");

try
            {
                // Set Peek to return immediately.
                myQueue.Peek(new TimeSpan(0));

// If an IOTimeout was not thrown, there is a message 
                // in the queue.
                isQueueEmpty = false;
            }

catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    // No message was in the queue.
                    isQueueEmpty = true;
                }

// Handle other sources of MessageQueueException.
            }

// Handle other exceptions as necessary.

// Return true if there are no messages in the queue.
            return isQueueEmpty;

}

---------------------------------------------------------------------------
queue.GetMessageEnumerator2()方法,为队列中的所有消息创建枚举数对象。可以使用MoveNext方法。
GetMessageEnumerator2 创建队列中所有消息的动态列表。可通过对 GetMessageEnumerator2 返回的 MessageEnumerator 调用 RemoveCurrent,从队列中移除位于枚举数的当前位置的消息。 
如果需要队列中消息的静态快照而不是与它们的动态连接,请调用 GetAllMessages。此方法返回 Message 对象的数组,这些对象表示调用该方法时的消息。

GetMessageEnumerator方法已经已过时。GetMessageEnumerator已被否决。应改用 GetMessageEnumerator2。 
---------------------------------------------------------------------------
异步读取queue和同步读取queue。

while (true)
{
    if (!IsQueueEmpty(queue))
    {
        IAsyncResult iresult = queue.BeginReceive(new TimeSpan(0), null, (ar) =>
        {
            lock (_lock)
            {
                SaveFile(@"c:\pp.txt", ar.IsCompleted.ToString());
            }
        });
        //do something
        Message mg = queue.EndReceive(iresult);
        SaveFile(@"c:\vv.txt", (string)mg.Body);
    }
    else
    {
        Console.WriteLine("No MSG,Waiting 2s");
        Thread.Sleep(2000);
        Console.WriteLine("2s passed");

}
}

while (true)
{
    if (!IsQueueEmpty(queue))
    {
        Message mg = queue.Receive();
    }
    else
    {
        Console.WriteLine("No MSG,Waiting 2s");
        Thread.Sleep(2000);
        Console.WriteLine("2s passed");

}
}

---------------------------------------------------------------------------
在MSMQ支持事务的情况下,可以使用MessageQueueTransaction
代码如下:
for (int i = 0; i < 2; i++)
{
Message myMessage1 = new Message(DateTime.Now.ToString("yyyy:MM:dd hh:mm:ss fff"), new BinaryMessageFormatter());
queue.Send(myMessage1,MessageQueueTransactionType.Single);
}

MessageQueueTransaction t = new MessageQueueTransaction();
try
{
t.Begin();
queue.Receive(t);
throw null;
t.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
t.Abort();
}

---------------------------------------------------------------------------
游标的使用
queue.CreateCursor();可以创建一个游标,然后在peek的时候,可以将这个游标作为参数传入。
要注意,第一次使用的时候,不能直接指定PeekAction.Next,比如m = queue.Peek(new TimeSpan(1000), c, PeekAction.Next);会出错。首次使用只能m = queue.Peek(new TimeSpan(1000), c, PeekAction.Current);之后游标自动指向下一个,接下来才能使用queue.Peek(new TimeSpan(1000), c, PeekAction.Next);

此处使用游标来计算消息队列里的消息个数
---------------------------------------------------------------------------
Cursor c = queue.CreateCursor();
            try
            {
                Message m = queue.Peek(new TimeSpan(1), c, PeekAction.Current);
                if (m != null)
                {
                    count = 1;
                    Message m1 = new Message();
                    while (m1 != null)
                    {
                        try
                        {
                            m1 = queue.Peek(new TimeSpan(1), c, PeekAction.Next);
                            count++;
                        }
                        catch (MessageQueueException ex)
                        {
                        //http://msdn.microsoft.com/zh-cn/library/system.messaging.messagequeueerrorcode%28v=VS.80%29.aspx
                            if (ex.MessageQueueErrorCode!=MessageQueueErrorCode.IOTimeout)
                            {
                                throw;
                            }

m1 = null;
                        }
                    }
                }
                Console.WriteLine(m.Id);

}
            catch (MessageQueueException ex1)
            {
                if (ex1.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
                {
                    throw;
                }
            }

---------------------------------------------------------------------------
        //**************************************************
        // Determines whether a queue is empty. The Peek()
        // method throws an exception if there is no message
        // in the queue. This method handles that exception 
        // by returning true to the calling method.
        //**************************************************

static public bool IsQueueEmpty(MessageQueue myQueue)
        {
            bool isQueueEmpty = false;

// Connect to a queue.
            //MessageQueue myQueue = new MessageQueue(".\\myQueue");

try
            {
                // Set Peek to return immediately.
                myQueue.Peek(new TimeSpan(0));

// If an IOTimeout was not thrown, there is a message 
                // in the queue.
                isQueueEmpty = false;
            }

catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode ==
                    MessageQueueErrorCode.IOTimeout)
                {
                    // No message was in the queue.
                    isQueueEmpty = true;
                }

// Handle other sources of MessageQueueException.
            }

// Handle other exceptions as necessary.

// Return true if there are no messages in the queue.
            return isQueueEmpty;

}

本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/617450 ,如需转载请自行联系原作者

MessageQueue的使用方法(一)相关推荐

  1. MessageQueue的使用方法(二)

    在对远程的MSMQ访问的时候,发现一个奇怪的现象 static string path = @"FormatName:DIRECT=TCP:sha-db\private$\mt1" ...

  2. Android中文API(127) —— MessageQueue

    结构 继承关系 public class MessageQueue extends Object java.lang.Object android.os.MessageQueue 类概述 保存消息列表 ...

  3. android源码分析-深入MessageQueue

    承接上文在looper中会在一开始就创建一个MessageQueue,并且在loop中每次都会从其中取出一个message处理.那么我们就来看看这个MessageQueue: MessageQueue ...

  4. 【Android 异步操作】Handler 机制 ( MessageQueue 空闲任务 IdleHandler 机制 )

    文章目录 一.MessageQueue 空闲任务 IdleHandler 机制 二.MessageQueue 中空闲任务 IdleHandler 相关源码 一.MessageQueue 空闲任务 Id ...

  5. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )

    文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...

  6. android 结束if循环_Android 消息机制(Handler + MessageQueue + Looper)

    Author:CrazyWah Date:2018.03.26 CopyRight:http://crazywah.com 禁止搬运!!!禁止搬运!!!禁止搬运!!! Android的消息机制主要由H ...

  7. 《深入理解Android:卷III A》一一2.3心系两界的MessageQueue

    本节书摘来华章计算机出版社<深入理解Android:卷III A>一书中的第2章,第2.3节,作者:张大伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2 ...

  8. Android 异步消息处理机制(Handler 、 Looper 、MessageQueue)源码解析

    1.Handler的由来 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread)来负责处理与UI相关的事件,我们叫做UI线程. Android的UI操作并不是线程安全的 ...

  9. Android源码学习(3) Handler之MessageQueue

    消息出队 MessageQueue封装了以单向列表实现的Message队列.在Looper循环中,通过调用MessageQueue的next()方法将队首元素出队进行处理: 1 Message nex ...

  10. Android 系统(18)---Handler,MessageQueue与Looper关系

    一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的 ...

最新文章

  1. scrapy软连接失效和pip软连接失效
  2. oracle中的存在函数吗,Oracle判断表是否存在的函数
  3. 路由交换以及其他网络名词基本概念
  4. knockoutJS学习笔记06:ko数组与模板绑定
  5. 20110128 学习记录:Datalist中的item项不自动换行而只用空格隔开
  6. 许久了,都体会不到恋爱的气息
  7. 第二届世界智能大会,看大咖眼中的智能时代
  8. vaniglia 源码学习(一)
  9. python流程图自动生成_python自动化办公 自动生成PPT通报
  10. 《概念与类比》:侯世达的双翼
  11. 浅谈电力巡检机器人功能及特点
  12. linux 命令无法Tab补全,命令参数无法补全
  13. 【阅读分享】红楼梦第一回-甄士隐的故事
  14. java引用类型内存_Java的引用类型的内存分析
  15. 迈向“5G智慧校园”的第一步,启用人脸识别门禁设备
  16. 华为A1路由器虚拟服务器,华为A1无线路由器的上网设置教程
  17. 消防应急照明和疏散指示系统——集中控制型系统的设计与应用
  18. Overlay 网络
  19. 玄学曲线——GPU呈现模式分析
  20. 青年歌手姚贝娜乳腺癌复发去世

热门文章

  1. 51单片机流水灯三种实现方法
  2. Windows7系统环境变量path的配置方法
  3. 设置Visual Studio代码折叠
  4. C#打开外部的exe程序并隐藏窗口、注册退出事件、传递参数
  5. 二维向量叉积的几何意义
  6. 区块链核心技术-P2P网络
  7. ems 的条形码生成PHP JS,thinkphp5 Barcodegen 生成条形码
  8. esp32摄像显示时间_ESP32彩屏显示入门:我要五彩斑斓的黑,还有五光十色的白
  9. 光缆弹性模量计算_光缆的基本常识
  10. 企业管理软件系统的重要性