在C#ASP.NET 3.5 Web应用程序在Windows消息队列的所有消息,我在一段时间出现以下错误一次:零星的错误而获得Windows Server 2003上运行
"Object reference not set to an instance of an object.: at System.Messaging.Interop.MessagePropertyVariants.Unlock()
at System.Messaging.Message.Unlock()
at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
at System.Messaging.MessageEnumerator.get_Current()
at System.Messaging.MessageQueue.GetAllMessages()".
的代码,将引发此行错误是:
Message[] msgs = Global.getOutputQueue(mode).GetAllMessages();
其中Global.getOutputQueue(mode)
给我希望从中获取邮件的消息队列。
更新:
Global.getPool(mode).WaitOne();
commonClass.log(-1, "Acquired pool: " + mode, "Report ID: " + unique_report_id);
............../* some code / .............. lock(getLock(mode)) { bool yet_to_get = true; int num_retry = 0; do { try { msgs = Global.getOutputQueue(mode).GetAllMessages(); yet_to_get = false; } catch { Global.setOutputQueue(mode); msgs = Global.getOutputQueue(mode).GetAllMessages(); yet_to_get = false; } ++num_retry; } while (yet_to_get && num_retry < 2); } ... / some code*/
....
finally
{
commonClass.log(-1, "Released pool: " + mode, "Report ID: " + unique_report_id);
Global.getPool(mode).Release();
}
Thanks tallseth。 MessageQueue对象已经在Application_Start(Object sender,EventArgs e)中创建。 Global.getOutputQueue(mode)方法只返回它。我错过了什么吗?谢谢。 public static MessageQueue getOutputQueue(char mode) { return(mode =='d')? outputQd:outputQw; } – engg 2012-07-05 22:22:09
听起来像你可能会遇到相反的问题,一个陈旧的队列处理。如果可能的话,不要将队列返回给调用代码,而是代理您需要的队列上的方法。然后捕获此异常,并通过重新创建队列来处理它,然后再次尝试。确保不要递解,但如果事情发生错误,你不想要无限循环。 – tallseth 2012-07-05 22:30:35