C#应用消息队列异步处理数据存储

消息队列”是 Microsoft 的消息处理技术,它在任何安装了 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。
“消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。
“消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。
   利用消息队列可以很好的异步来出来数据传送和存储,当你频繁的向数据库中插入时,就可采取消息队列来异步向数据库中插入数据。向将要插入的数据发送到指 定的消息队列中,在有后台将消息读取插入到数据库中,在Pet Shop4.0中接订单的操作就是利用消息队列,先将接下的订单插入到消息队列中就立即返回,由后台接收消息插入订单。
下面是两个小程序,分别用来向消息队列中写入消息和向消息队列中读取消息。界面如下:


我是在VS2005中实现的,首先要添加System.Messaging.dll的引用:

主要代码:

//1 创建消息队列

private void btnCreate_Click(object sender, EventArgs e)
{
   String Path = txtPath.Text;
   try
   {
       this.Cursor = Cursors.WaitCursor;
       //判断队列是否存在,不存在就创建
      EnsureQueueExists(Path);
       MyQueue = new System.Messaging.MessageQueue(Path,true);
      
      this.listView1.Items.Clear();
       tssl.Text = "创建成功!";
   
   }
   catch (MessageQueueException ex)
   {
       MessageBox.Show(ex.Message);
   }
   finally
   {
       this.Cursor = Cursors.Default;
   }
}
EnsureQueueExists方法

/** 检查队列,如果队列不存在,则建立
///
/// 队列名称
private static void EnsureQueueExists(string path)
{
   if (!System.Messaging.MessageQueue.Exists(path))
   {
       if (!System.Messaging.MessageQueue.Exists(path))
       {
       System.Messaging .MessageQueue.Create(path,false);
       System.Messaging.MessageQueue mqTemp = new System.Messaging.MessageQueue(path);
      mqTemp.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl);
      //mqTemp.Label = "MMM";
       }
   }
}
发送消息
//发送消息
private void btnSend_Click(object sender, EventArgs e)
{
   MessageQueueTransaction myTransaction= new MessageQueueTransaction();;
   try
   {
       if (MyQueue == null)
       {
      return;
       }
       //Order为一个类对象,有两个对象:消息和发送的时间
       Model.Order order = new Model.Order();
       order.Message = txtMessage.Text;
       order.SendTime = DateTime.Now;

       //加入事务,前提条件是该消息队列在创建时支持事务
     
       myTransaction.Begin();
   //发送
      MyQueue.Send(order);
       myTransaction.Commit();

       InsertListView(order);
   }
   catch (MessageQueueException   ex)
   {
       //myTransaction.Abort();
       MessageBox.Show(ex.Message);
   }

}接受消息端:
private void btnListen_Click(object sender, EventArgs e)
{
   try
   {
       string Path = txtPath.Text.Trim ();
       if (!System.Messaging.MessageQueue.Exists(Path))
       {
      MessageBox.Show("该消息队列不存在");
      txtPath.SelectAll();
      return;
       }
       this.listView1.Items.Clear();

       System.Messaging.MessageQueue MyQueue = new System.Messaging.MessageQueue(Path);
      //这句很重要,序列化接受到的消息数据,否则不知道接收到的数据,我发送的数据类型为Order,所以此也为
       MyQueue .Formatter =new XmlMessageFormatter (new Type []{typeof (Model .Order)});
       MyQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(MyReceiveCompleted);
       MyQueue.BeginReceive();
   }
   catch (MessageQueueException   ex)
   {
       MessageBox.Show(ex.Message);
   }
}
异步接收消息

private   void MyReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
{
   try
   {
            MessageQueue mq = (MessageQueue)source;
            System.Messaging .Message ms = mq.EndReceive(asyncResult.AsyncResult);
       listView1.Invoke(new EventHandler(Event), new object[] { ms.Body, EventArgs.Empty });
  
  
            mq.BeginReceive();
         }
         catch(MessageQueueException ex)
         {
       MessageBox.Show(ex.Message);
         }
         return;
}
private void Event(object o, EventArgs e)
{
   InsertListView((Model .Order )o);
}
private   void InsertListView(Model.Order Obj)
{
   ListViewItem Item = new ListViewItem();
   Item.Text = Obj.Message;
   Item.SubItems.Add(Obj.SendTime.ToString ());
   this.listView1.Items.Insert(0,Item);
}
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值