gpt4 book ai didi

c# - .NET 异步 MSMQ

转载 作者:太空狗 更新时间:2023-10-29 23:18:20 25 4
gpt4 key购买 nike

我不明白这是哪里出了问题。基本上,我有一个从消息队列接收并处理消息的程序。程序可以随时停止,在这种情况下,消息循环会在程序退出之前完成它正在做的事情。我正在尝试使用以下代码完成此操作:

private MessageQueue q;
private ManualResetEventSlim idle;

public void Start()
{
idle = new ManualResetEventSlim();
q.ReceiveCompleted += this.MessageQueue_ReceiveCompleted;
q.BeginReceive();
}

public void Stop()
{
this.q.Dispose();
this.idle.Wait();
}

private void MessageQueue_ReceiveCompleted(object sender,
ReceiveCompletedEventArgs e)
{
Message inMsg;
try
{
inMsg = e.Message;
}
catch (Exception ex)
{
this.idle.Set();
return;
}

// Handle message

this.q.BeginReceive();
}

希望很明显,Stop 方法处理消息队列,然后等待设置空闲等待句柄(这应该发生,因为在处理时将调用 ReceiveCompleted 事件,但 e.Message 属性应该除外).

但是,消息循环还在继续!我已经处理了消息队列,但它仍然设法从中读取并且未调用异常处理程序,这意味着空闲。等待线永远等待。

我的理解是处理消息队列应该结束任何未决的接收并调用事件,但是 e.Message(或 q.EndReceive)应该抛出异常。不是这样吗?如果不是,我还能如何安全地退出消息循环?

谢谢

更新:

这是一个完整的例子(假设队列存在)

class Program
{
static MessageQueue mq;
static ManualResetEventSlim idleWH;

static void Main(string[] args)
{
idleWH = new ManualResetEventSlim();

Console.WriteLine("Opening...");
using (mq = new MessageQueue(@".\private$\test"))
{
mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(int) });
mq.ReceiveCompleted += mq_ReceiveCompleted;

for (int i = 0; i < 10000; ++i)
mq.Send(i);

Console.WriteLine("Begin Receive...");
mq.BeginReceive();

Console.WriteLine("Press ENTER to exit loop");
Console.ReadLine();

Console.WriteLine("Closing...");

mq.Close();
}

Console.WriteLine("Waiting...");
idleWH.Wait();

Console.WriteLine("Press ENTER (ex)");
//Console.ReadLine();
}

static void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
try
{
var msg = mq.EndReceive(e.AsyncResult);
Console.Title = msg.Body.ToString();

// Receive next message
mq.BeginReceive();
}
catch (Exception ex)
{
idleWH.Set();
return;
}
}
}

最佳答案

完全不确定您是如何完成这项工作的。您必须在事件中调用 MessageQueue.EndReceive()。只有那个方法可以抛出异常。查看 ReceiveCompleted 事件的 MSDN 示例代码。并且不要捕获异常,这只会导致无法诊断的故障。捕获处置队列时获得的特定异常,ObjectDisposedException。

关于c# - .NET 异步 MSMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com