Служба очереди сообщений Windows - PullRequest
1 голос
/ 23 февраля 2009

Я хочу написать службу Windows в .Net 2.0, которая прослушивает и обрабатывает очередь сообщений (MSMQ).

Вместо того, чтобы изобретать велосипед, может кто-нибудь опубликовать пример лучшего способа сделать это? Он должен обрабатывать вещи только по одному, а не параллельно (например, потоки).

По сути, я хочу, чтобы он опросил очередь, если там что-то есть, обработайте, снимите с очереди и повторите. Я хочу сделать это также системно-эффективным способом.

Спасибо за любые предложения!

Ответы [ 2 ]

4 голосов
/ 23 февраля 2009

Есть несколько разных способов сделать это. Я бы порекомендовал настроить событие в очереди сообщений, чтобы вы получали уведомление о доступности сообщения, а не опрашивали его.

Простой пример использования очередей сообщений: http://www.codeproject.com/KB/cs/mgpmyqueue.aspx, а документацию MSDN для прикрепления событий и т. Д. Можно найти по адресу http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue_events.aspx

Пример Microsoft от здесь :

           ....
           // Create an instance of MessageQueue. Set its formatter.
           MessageQueue myQueue = new MessageQueue(".\\myQueue");
            myQueue.Formatter = new XmlMessageFormatter(new Type[]
                {typeof(String)});

            // Add an event handler for the ReceiveCompleted event.
            myQueue.ReceiveCompleted += new 
                ReceiveCompletedEventHandler(MyReceiveCompleted);

            // Begin the asynchronous receive operation.
            myQueue.BeginReceive();
            ....


        private static void MyReceiveCompleted(Object source, 
            ReceiveCompletedEventArgs asyncResult)
        {
            // Connect to the queue.
            MessageQueue mq = (MessageQueue)source;

            // End the asynchronous Receive operation.
            Message m = mq.EndReceive(asyncResult.AsyncResult);

            // Display message information on the screen.
            Console.WriteLine("Message: " + (string)m.Body);

            // Restart the asynchronous Receive operation.
            mq.BeginReceive();

            return; 
        }
4 голосов
/ 23 февраля 2009

Ознакомьтесь с примерами WCF на http://msdn.microsoft.com/en-us/library/ms751514.aspx.

РЕДАКТИРОВАТЬ: Обратите внимание, что мой ответ был дан до редактирования, чтобы указать с помощью .Net 2.0. Я все еще думаю, что WCF - это путь, но для этого потребуется .NET 3.0, по крайней мере.

...