这是一种向MSMQ发出信号以取消阻止在BeginReceive上被阻止的订户的方法吗?
基本上我使用异步MSMQ API来读取这样的消息:
public void Start()
{
this.queue.ReceiveCompleted += this.ReceiveCompleted;
this.queue.BeginReceive();
}
void ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
this.queue.EndReceive(e.AsyncResult);
try
{
var m = e.Message;
m.Formatter = this.formatter;
this.Handle(m.Body);
}
finally
{
this.queue.BeginReceive();
}
}
public void Stop()
{
this.queue.ReceiveCompleted -= this.ReceiveCompleted;
//Force an EndReceive here maybe or somehow indicate that
//the BeginReceive set above should "unblock"
this.queue.Dispose();
}
问题:
1)我想在Stop()方法中向MSMQ发信号以取消阻止当前的BeginReceive()。 注意:我知道接受超时的BeginReceive重载。我更愿意 避免超时和定期循环,这似乎很浪费。 这是可能吗?如果没有,将处置队列确保任何已注册的代表 是否正确清理?
2)可以在" ReceiveCompleted"中重复调用BeginReceive。导致任何泄漏? 即除了在Stop()中取消订阅代表之外,是否需要进行其他清理?
this.queue.ReceiveCompleted -= this.ReceiveCompleted;
答案 0 :(得分:1)
1)是的,你只需关闭队列。执行此操作时,您应该看到对ReceiveCompleted的调用,错误代码为0xC0000120,其定义为STATUS_CANCELLED
,文本为“I / O请求已取消。”
2)您必须在ReceiveCompleted事件中调用BeginReceive才能继续接收消息。