title: How do I subscribe to a MSMQ queue but only "peek" the message in .Net?
body: <p>We have a MSMQ Queue setup that receives messages and is processed by an application. We'd like to have another process subscribe to the Queue and just read the message and log it's contents. </p>
  
  <p>I have this in place already, the problem is it's constantly peeking the queue. CPU on the server when this is running is around 40%. The mqsvc.exe runs at 30% and this app runs at 10%. I'd rather have something that just waits for a message to come in, get's notified of it, and then logs it without constantly polling the server. </p>
  
  <pre><code>    Dim lastid As String
      Dim objQueue As MessageQueue
      Dim strQueueName As String
  
      Public Sub Main()
          objQueue = New MessageQueue(strQueueName, QueueAccessMode.SendAndReceive)
          Dim propertyFilter As New MessagePropertyFilter
          propertyFilter.ArrivedTime = True
          propertyFilter.Body = True
          propertyFilter.Id = True
          propertyFilter.LookupId = True
          objQueue.MessageReadPropertyFilter = propertyFilter
          objQueue.Formatter = New ActiveXMessageFormatter
          AddHandler objQueue.PeekCompleted, AddressOf MessageFound
  
          objQueue.BeginPeek()
      end main
  
      Public Sub MessageFound(ByVal s As Object, ByVal args As PeekCompletedEventArgs)
  
          Dim oQueue As MessageQueue
          Dim oMessage As Message
  
          ' Retrieve the queue from which the message originated
          oQueue = CType(s, MessageQueue)
  
              oMessage = oQueue.EndPeek(args.AsyncResult)
              If oMessage.LookupId &lt;&gt; lastid Then
                  ' Process the message here
                  lastid = oMessage.LookupId
                  ' let's write it out
                  log.write(oMessage)
              End If
  
          objQueue.BeginPeek()
      End Sub
  </code></pre>