Parallel.Foreach с MSMQ

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

Ошибка: тело свойства не было получено при получении сообщения. Убедитесь, что свойство PropertyFilter установлено правильно.

Когда я делаю тот же цикл с foreach (без параллели), все работает хорошо.

Любая идея, что я должен сделать, чтобы решить эту проблему?


person m0fo    schedule 17.08.2012    source источник
comment
У вас есть код, чтобы показать? Согласно MSDN только метод GetAllMessages является потокобезопасным. Потокобезопасный способ асинхронного чтения очереди показан здесь.   -  person PHeiberg    schedule 18.08.2012
comment
Связанный вопрос: stackoverflow.com/ вопросы/5503954/   -  person PHeiberg    schedule 18.08.2012
comment
@Ido Lazar: Вы просто просматриваете сообщения или удаляете их из очереди?   -  person Dominic Zukiewicz    schedule 27.08.2012


Ответы (3)


Похоже, вы используете не потокобезопасный метод, как в msdn

Только метод GetAllMessages является потокобезопасным.

person GSerjo    schedule 17.08.2012

Peek() и Receive() (и их варианты) не потокобезопасны. Вам нужно будет придумать механизм блокировки, чтобы избежать столкновений.

person kprobst    schedule 17.08.2012

Параллельная обработка не будет работать для извлечения сообщений из очереди, поскольку она является последовательной и (если настроена) транзакционной.

Если вы удалите A и B, а обработка для A завершится неудачно, он будет возвращен в очередь, но B также был удален?

GetAllMessages() вернет их все, но не удалит. Вам нужно использовать Receive() для каждого сообщения отдельно, чтобы полностью удалить его из очереди.

person Dominic Zukiewicz    schedule 27.08.2012