如何从MSMQ中正确取消订阅事件处理程序

时间:2014-07-01 06:56:25

标签: .net msmq

这是一种向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;

1 个答案:

答案 0 :(得分:1)

1)是的,你只需关闭队列。执行此操作时,您应该看到对ReceiveCompleted的调用,错误代码为0xC0000120,其定义为STATUS_CANCELLED,文本为“I / O请求已取消。”

2)您必须在ReceiveCompleted事件中调用BeginReceive才能继续接收消息。

相关问题