C# 启动和停止窗口服务时System.Messaging.MessageQueueException(0x80004005)错误
实际上,我有一个窗口服务,它每隔一段时间读取MSMQ queuw。我的MSMQ队列正常工作,但问题是当我停止或启动windows服务时,它会抛出一个错误。完整错误如下所示:C# 启动和停止窗口服务时System.Messaging.MessageQueueException(0x80004005)错误,c#,.net,service,msmq,C#,.net,Service,Msmq,实际上,我有一个窗口服务,它每隔一段时间读取MSMQ queuw。我的MSMQ队列正常工作,但问题是当我停止或启动windows服务时,它会抛出一个错误。完整错误如下所示: **ERROR 65 DAL.MsmqImportListener - A MSMQ error occured System.Messaging.MessageQueueException (0x80004005) at System.Messaging.MessageQueue.AsynchronousRequest.E
**ERROR 65 DAL.MsmqImportListener - A MSMQ error occured
System.Messaging.MessageQueueException (0x80004005)
at System.Messaging.MessageQueue.AsynchronousRequest.End()
at DAL.MsmqImportListener.PeekCompleted(Object sender, PeekCompletedEventArgs e)**
private static void PeekCompleted(object sender, PeekCompletedEventArgs e)
{
var msmq = sender as MessageQueue;
var messageProcessor = e.AsyncResult.AsyncState as MessageProcessorMethod;
try
{
using (var scope = new TransactionScope())
{
msmq.EndPeek(e.AsyncResult);
var message = msmq.ReceiveById(
e.Message.Id,
TimeSpan.FromSeconds(double.Parse(ConfigurationManager.AppSettings["MsmqReceiveTimeout"])),
MessageQueueTransactionType.Automatic);
messageProcessor(message);
scope.Complete();
}
}
catch (MessageQueueException mqe)
{
// Check if timeout...no action if timeout, else log error
if (mqe.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
{
Logger.Error("A MSMQ error occured", mqe);
EmailDispatcher.SendInformationEmail("A MSMQ error occured" + Environment.NewLine + mqe);
}
}
catch (Exception ex)
{
Logger.Error(
string.Format(
CultureInfo.InvariantCulture,
"An unexpected error was encountered, message with id {0} was put in error queue: {1}",
e.Message.Id,
success),
ex);
}
finally
{
msmq.BeginPeek(TimeSpan.FromSeconds(double.Parse(ConfigurationManager.AppSettings["MsmqPeekTimeout"])), messageProcessor);
}
}
你试过这个帖子的答案吗?是的,我试过这个解决方案,但没有成功!我的队列名称是小写字母,无法更改队列名称。您有权访问代码吗?能否将完整堆栈跟踪记录到日志文件中?我已更新代码,但没有完整堆栈跟踪。如果在每个步骤上添加“日志”,则代码可能未捕获异常。它可能是由发送方或e失败的;临时注释“if(mqe.messagequeueerrocode!=messagequeueerrocode.IOTimeout)”