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