【问题标题】:Parallel.Foreach with MSMQParallel.Foreach 与 MSMQ
【发布时间】:2012-08-14 08:48:30
【问题描述】:

我正在尝试对队列中的所有消息在并行 foreach 循环中运行,但出现此错误:

错误:接收消息时未检索到属性正文。确保 PropertyFilter 设置正确。

当我使用 foreach(没有并行)执行相同的循环时,一切正常。

知道我应该怎么做才能解决这个问题吗?

【问题讨论】:

  • 你有代码要显示吗?根据MSDN,只有GetAllMessages 方法是线程安全的。异步读取队列的线程安全方式似乎显示为here
  • @Ido Lazar:您只是查看消息还是将它们从队列中删除?

标签: c# .net task-parallel-library msmq


【解决方案1】:

根据msdn,看起来您使用的不是线程安全方法

只有 GetAllMessages 方法是线程安全的

【讨论】:

    【解决方案2】:

    Peek()Receive()(及其变体)不是线程安全的。你需要想出一个阻塞机制来避免冲突。

    【讨论】:

      【解决方案3】:

      并行处理不适用于从队列中取出消息,因为它是顺序的并且(如果已配置)事务性的。

      如果您删除 A 和 B,并且对 A 的处理失败,它将返回到队列中 - 但 B 也已被删除?

      GetAllMessages() 将返回所有这些,但不会删除它们。你需要使用 Receive() 将每条消息单独从队列中完全删除。

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 2012-12-21
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        相关资源
        最近更新 更多