2009-09-22 29 views
1

使用COM可以获得队列的MessageCount属性。我可以用MSMQ.Interop实现同样的功能,但我想知道是否有任何方法可以用纯.NET方法来实现这一点?如何从.NET中的MSMQ队列获取MessageCount?

+0

不幸的是微软在这里搞砸了,忘了实现一个MessageQueue.MessageCount属性。 .NET中唯一的API是.GetAllMessages()方法,但如果队列中有成千上万条消息,则这会提供非常差的性能。目前唯一真正的选择是WMI,COM​​,或者在增加计数器的同时实现自己的枚举和窥探消息的自定义技术。这里提到了一些替代方法:http://stackoverflow.com/questions/3869022/is-there-a-way-to-check-how-many-messages-are-in-a-msmq-queue – 2012-05-09 23:54:16

回答

0

当然,使用WMI:

Select * From Win32_PerfRawData_MSMQ_MSMQQueue 
+0

不幸的是,当使用这个方法将队列名称截断为64个字符,对于大多数情况下,可以使此选项不可用。请参阅:http://connect.microsoft.com/VisualStudio/feedback/details/91525/system-daignostics-performancecounter-fails-when-using-instance-name-64-characters – 2012-05-10 00:03:01

0

当然!您可以使用LINQ它快速和简单

  int Total = 0; 
      using (var queue = new MessageQueue("queue_name", QueueAccessMode.ReceiveAndAdmin)) 
      { 
       Total = (from Message msg in queue 
         select msg).Count(); 
      } 
0

这是计算私人队列内消息的最快方法。

//using System.Diagnostics 
    int messageCount =0; 
    private MessageQueue[] privatequeuelist = MessageQueue.GetPrivateQueuesByMachine(Dns.GetHostName()); 
    foreach(var Queue in MessageQueue) 
    { 
     string fullyQualifiedQueueName = string.Format(@"{0}\{1}", Environment.MachineName, Queue.QueueName); 
     PerformanceCounterCategory category = new PerformanceCounterCategory("MSMQ Queue"); 
     PerformanceCounter cntr = new PerformanceCounter("MSMQ Queue", "Messages in Queue"); 
     if (category.InstanceExists(fullyQualifiedQueueName.ToLower())) 
      { 
       cntr.InstanceName = fullyQualifiedQueueName.ToLower(CultureInfo.CurrentCulture); 
       messageCount = (int)cntr.NextValue(); 
      } 
     Console.WriteLine(Queue.QueueName + "===" + messageCount); 
    } 
    Console.ReadLine();