/// <summary>
        /// A message was received on monitored MSMQ queue
        /// </summary>
        /// <param name="receiver">MSMQ Receiver that received the message</param>
        /// <param name="message">MSMQ Message received</param>
        /// <remarks>
        /// We want to now notify the original workflow that subscribed to this
        /// MSMQ queue that a message was received. For this we need to first copy
        /// all the relevant data in the MSMQ message into a serializable format
        /// so we can put it into the WorkflowQueue given to us when
        /// the subscription was done.
        /// </remarks>
        private void OnMessageReceived(Receiver receiver, Message message)
        {
            if ( receiver == null )
            throw new ArgumentNullException("receiver");
             if ( message == null )
            throw new ArgumentNullException("message");

             try
             {
            _lock.AcquireReaderLock(Timeout.Infinite);

            foreach ( MsmqSubscription subscription in _subscriptionsByID.Values )
            {
               StringComparer comparer = StringComparer.InvariantCultureIgnoreCase;
               if ( comparer.Compare(subscription.MsmqQueue, message.DestinationQueue.FormatName) == 0 )
               {
                  // ensure that each instance gets it's own copy
                  MessageDataEventArgs data = new MessageDataEventArgs(message);
                  NotifyWorkflow(subscription, data);
               }
            }
             } finally
             {
            _lock.ReleaseReaderLock();
             }
        }
        private void NotifyWorkflow(MsmqSubscription subscription, MessageDataEventArgs data)
        {
            TraceUtil.WriteInfo("MsmqListenerService::NotifyWorkflow({0}, {1})", subscription.MsmqQueue, subscription.WfQueueName);

             WorkflowInstance instance =
            Runtime.GetWorkflow(subscription.WorkflowInstance);
             instance.EnqueueItem(subscription.WfQueueName, data, null, null);
        }