0

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

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

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

问候马丁

// 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);
4

1 回答 1

1

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

推荐的使用方法MessageQueueTransaction是从一个新的 MTA 线程开始。您可以这样做,new Thread也可以使用Task.Factory.StartNew

于 2013-03-12T15:01:50.630 回答