Частная очередь MSMQ - не получает - PullRequest
0 голосов
/ 06 сентября 2010

Новое в MSMQ ... Моя локальная очередь никогда не получает мое тестовое сообщение.Я подтвердил, что в моем диалоговом окне «Службы» (Vista Ultimate) запущены триггеры очереди сообщений и очереди сообщений.Мысли?

class ConsoleApplication
{
    private const string Path = @".\private$\SomeQueue";

    static void Main(string[] args)
    {
        var queue = !MessageQueue.Exists(Path) 
         ? MessageQueue.Create(Path) 
         : new MessageQueue(Path) { Formatter = new BinaryMessageFormatter() };

        queue.ReceiveCompleted += queue_ReceiveCompleted;
        queue.BeginReceive();
        queue.Send("test message");
        Console.ReadLine();
        queue.Close();
    }

    static void queue_ReceiveCompleted(object sender, 
                                        ReceiveCompletedEventArgs e)
    {
        Console.WriteLine("Received message...");
        var queue = (MessageQueue)sender;
        try
        {
            var message = queue.EndReceive(e.AsyncResult);
            Console.WriteLine("Processing message...");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            queue.BeginReceive();
        }
    }
}

РЕДАКТИРОВАТЬ: Просто подумал, попробуйте удалить и заново создать очередь с MessageQueue.Delete (Path).И это сработало.Я думаю, моя очередь как-то спряталась.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

попробуйте добавить

queue.ReceiveCompleted += queue_ReceiveCompleted;

в блок finally для события static void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e).

1 голос
/ 07 сентября 2010

Я сомневаюсь, что сама очередь была нарушена.Скорее всего, проблема синхронизации между созданием очереди и доступом к ней.MSMQ должен выполнить различные операции, такие как создание файла конфигурации в каталоге LQS, до того, как будет доступна личная очередь.

0 голосов
/ 07 сентября 2010

Вы не можете получить доступ к консоли одновременно. Попробуйте сделать thread.Sleep () и установите логическое значение в вашем обратном вызове. Затем вы можете выполнить readline после того, как логическое значение установлено для чтения вашего вывода.

while (!received)
{
    System.Threading.Thread.Sleep(1000);
}
Console.ReadLine();

Возможно, вы захотите использовать точку останова и debug.WriteLine () для чтения вывода, записанного в окне вывода visual studio.

...