博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

原创:一个操作Message Queue的辅助类

Posted on 2007-07-02 15:23  Johnson Cao  阅读(471)  评论(0)    收藏  举报

有一个项目多线程通信,就选择了消息队列进行通信,所以就写了一个这样的辅助类.

  1/****************************************************************** 
  2* Copyright(c) KiteSoft Studio 
  3* Description : MessageQueue helper class 
  4* CreateDate : 2006-05-11 02:28:58 
  5* Creater : Johnson Cao 
  6* LastChangeDate: 2007-04-11 
  7* LastChanger : Johnson Cao 
  8* Version Info : 1.1 
  9* Email : KiteSupport@gmail.com 
 10* ******************************************************************/
 
 11
 12using System; 
 13using System.Collections.Generic; 
 14using System.Text; 
 15using System.Messaging; 
 16
 17namespace KiteSoft.Utils 
 18
 19/// <summary> 
 20/// Message Queue helper class 
 21/// </summary> 
 22/// <typeparam name="T"></typeparam> 

 23public class MessageQueueHelper<T> : MarshalByRefObject where T : classnew() 
 24
 25public MessageQueueHelper(string path) 
 26
 27m_AllowException = true
 28if (MessageQueue.Exists(path)) 
 29m_Msq = new MessageQueue(path); 
 30else 
 31
 32m_Msq = MessageQueue.Create(path); 
 33m_Msq.MaximumQueueSize = CommonSettings.QueueMaxSize; 
 34}
 
 35m_Msq.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl); 
 36
 37m_Msq.Formatter = new XmlMessageFormatter(new Type[] typeof(T) }); 
 38m_Msq.Label = typeof(T).Name; 
 39m_Msq.ReceiveCompleted += new ReceiveCompletedEventHandler(Msq_ReceiveCompleted); 
 40}
 
 41
 42~MessageQueueHelper() 
 43
 44Close(); 
 45}
 
 46
 47private MessageQueue m_Msq; 
 48private bool m_AllowException; 
 49
 50public bool AllowException 
 51
 52get return m_AllowException; } 
 53set { m_AllowException = value; } 
 54}
 
 55
 56private bool MssageQueueReady() 
 57
 58if (m_Msq == null
 59if (AllowException) 
 60throw new Exception("The message queue is not ready."); 
 61else 
 62return false
 63else 
 64return true
 65}
 
 66
 67public void Send(object msg) 
 68
 69if (!msg.GetType().Equals(typeof(T))) return
 70if (!MssageQueueReady()) return
 71try 
 72
 73m_Msq.Send(msg); 
 74}
 
 75catch 
 76
 77// TODO: Send Message queue failed 
 78}
 
 79}
 
 80
 81public void Send(object msg, string label) 
 82
 83if (!MssageQueueReady()) return
 84
 85try 
 86
 87m_Msq.Send(msg, label); 
 88}
 
 89catch 
 90
 91// TODO: Send Message queue failed 
 92}
 
 93}
 
 94
 95public T Receive() 
 96
 97if (!MssageQueueReady()) return default(T); 
 98Message m = m_Msq.Receive(MessageQueueTransactionType.Single); 
 99return m.Body as T; 
100}
 
101
102public IList<T> ReceiveAll() 
103
104if (!MssageQueueReady()) return null
105Message[] ms = m_Msq.GetAllMessages(); 
106IList<T> list = new List<T>(); 
107foreach (Message m in ms) 
108
109list.Add(m.Body as T); 
110}
 
111
112return list; 
113}
 
114
115public T Peek() 
116
117if (!MssageQueueReady()) return default(T);
118//m_Msq.Formatter = new XmlMessageFormatter(new Type[] { typeof(T) }); 
119Message m = m_Msq.Peek(); 
120return m.Body as T; 
121}
 
122
123public void AsynchronismReceive() 
124
125if (!MssageQueueReady()) return
126m_Msq.BeginReceive(); 
127}
 
128
129public void EndReceive() 
130
131if (!MssageQueueReady()) return
132}
 
133
134private void Msq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
135
136MessageQueue mq = (MessageQueue)sender; 
137Message m = mq.EndReceive(e.AsyncResult); 
138if (ReceiveEvent != null
139ReceiveEvent(thisnew ReceiveEventArgs<T>(m.Body as T)); 
140mq.BeginReceive(); 
141}
 
142
143public event ReceiveEventHandler ReceiveEvent; 
144
145public delegate void ReceiveEventHandler(object sender, ReceiveEventArgs<T> e); 
146
147public void Close() 
148
149if (m_Msq != null
150m_Msq.Close(); 
151}
 
152}
 
153
154public class ReceiveEventArgs<T> : EventArgs where T : class 
155
156public ReceiveEventArgs(T result) 
157
158m_Result = result; 
159}
 
160
161private T m_Result; 
162public T Result 
163
164get return m_Result; } 
165//set { m_Result = value; } 
166}
 
167}
 
168}
 
169
170 
171
在线帮助MSN:flyaqiao@hotmail.com
技术支持: KiteSupport@gmail.com
Copyright (c) 2006 KiteSoft, All Rights Reserved.