2017-02-22 55 views
0

Я использую Реализация Этап этого URL-адреса how-can-i-read-messages-from-a-queue-in-parallel, он работает хорошо, когда я использовал его раньше, через какое-то время он не работает, Понимаете, что происходит? Проведя время, я делаю вывод, что программа останавливается по определенному методу.Task.StartNew.ReceiveAsync() не работает должным образом при получении сообщений от MSMQ

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndPeek. 
    /// </summary> 
    private static Task<Message> PeekAsync(MessageQueue messageQueue) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginPeek(), messageQueue.EndPeek); 
    } 

когда я закомментировать эту реализацию на RunAsync() метода и вызова метода ReceiveAsync()

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndReceive. 
    /// </summary> 
    private static Task<Message> ReceiveAsync(MessageQueue messageQueue, TimeSpan timeout) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek); 
    } 

затем программа кончить, не является исключением, ни какой-либо вещи происходят. Просто программа прекращается.

с моей перспективы Task.Factory.FromAsync() - причина, но не undesrtand почему ??

Если я использую ту же очередь с получением сообщений, как BeginReceive() обработчик событий, он работает нормально. Как узнать об этом?

+0

Вы можете подписаться на UnhandledException для тока 'AppDomain' – VMAtm

ответ

0

В функции ReceiveAsync второй параметр FromAsync должен быть messageQueue.EndReceive вместо messageQueue.EndPeek.

+0

у правы, у меня есть осуществить то же самое также, но не работает – Faraz

0

Прежде всего.

Как указал @xwlantian. Смешивание пар APM.

Вы всегда должны соответствовать вашему BeginXXX с правилом EndXXX. В противном случае вы получите исключение.

В вашем случае

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek) 

Следует читать

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndReceive) 

Однако, вы должны быть в состоянии исправить это самостоятельно, если вы имели правильную информацию (исключение/StackTrace). Что вы утверждаете, пропало без вести.

Это неправда.

Причина, по которой вы не заметили исключения, заключается в том, что Visual Studio не сделала break на вашем исключении (что типично, как вы «находите» исключения). Вместо этого вы можете посмотреть свой Windows Event Viewer, и вы должны найти там исключение.

Почему вы не заметили исключение?

Следующая верны

  1. Ваше исключение произошло на фоне потока с не попробовать/поймать пару стек.
  2. У вас не было обработчика исключений на AppDomain.
  3. У вас есть «Только мой код» в настройках «Отладка».
+0

я тестировал с теми же парами также, но не работают.я проверяю вашу предоставленную информацию позже – Faraz

+0

Но как протестировать 'Task.Factory.FromAsync (messageQueue.BeginReceive (timeout), messageQueue.EndReceive);' поскольку это новая задача и ее реализация скрыта, более того, она закрыта когда отладчик запускает эту строку. пожалуйста, объясните – Faraz

+0

Вы взглянули на исключение, где я сказал вам посмотреть? Мое психическое могущество может занять меня до сих пор. Дайте мне вашу трассировку исключения/стека, если вам нужна дополнительная помощь. – Aron