c#调用System.Messaging.MessageQueueTransaction.Commit()时出现sync

本文关键字:sync Commit 调用 System Messaging MessageQueueTransaction | 更新日期: 2023-09-27 18:03:25

我的代码从消息队列读取事务性消息。代码已经运行了成千上万条消息,当我提交之前读取的消息之一时,突然抛出了一个异常。提交是在与读取消息的线程不同的线程上执行的,我认为这应该不是问题。关于事务的文档没有告诉我要将提交或中止方法与某个对象同步。此异常与使用监视器有关,但我没有使用监视器,底层框架代码可能会这样做,但这超出了我的控制范围。

当我在消息队列上进行定时读取时,我曾经偶尔会遇到这种异常,我已经重写了代码,以便它首先使用异步peek来检查是否有要读取的数据。这样我就避免了异常的发生。但现在它又回来了。

请帮助我如何避免此异常,或者这是c#框架底层代码中的错误?

问候Martien

// Part of thread code that reads transaction
transaction = new MessageQueueTransaction();
transaction.Begin();
message = _ItfSureStoreInstance.MQSet.MQ_Retry.mqueue.Receive(transaction);
// We have data received
DataImplementation<TMessage> dataRxd = new DataImplementation<TMessage>(this,message,transaction,true);

c#调用System.Messaging.MessageQueueTransaction.Commit()时出现sync

http://msdn.microsoft.com/en-us/library/system.messaging.messagequeuetransaction.aspx有很好的文档记录。它详细说明了这不能在单线程公寓(STA)线程上使用。Winforms应用程序必须在主(UI)线程上是STA。这意味着不支持在WinForm(或默认的Console应用程序主线程)中使用MessageQueueTransaction(即它偶尔会失败)。

使用MessageQueueTransaction的推荐方法是从一个新的MTA线程中执行。您可以使用new ThreadTask.Factory.StartNew