首页 > 解决方案 > 单例类触发事件只有一次

问题描述

我是新编写单例类,但我遇到了一种奇怪的行为。在我的单身课程中,我有一个只触发一次的事件。此事件是 System.Messaging.MessageQueue 类的 ReceiveCompleted。我的单例类有一个 GetCartAsync 方法,它通过 MSMQ 从另一个应用程序向“FleetClientQueue”队列请求信息,该队列是 ReceiveCompleted 订阅的队列。这是单例类:

public sealed class CartRepository : ICartRepository
{
    private CartRepository()
    {
        if (!MessageQueue.Exists(string.Format(".\\Private$\\FleetClientQueue"))) ;
        {
            fleetClientQueue = MessageQueue.Create(".\\Private$\\FleetClientQueue");
            fleetClientQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
        }
        fleetClientQueue = new MessageQueue(".\\Private$\\FleetClientQueue");
        fleetClientQueue.Formatter = new XmlMessageFormatter(new[] { typeof(Cart) });
        fleetClientQueue.ReceiveCompleted += FleetClientQueue_ReceiveCompleted;
        fleetClientQueue.BeginReceive();
    }

    static ManualResetEvent expectedEchoReceived = new ManualResetEvent(false);
    Cart _cart = new Cart();        
    static MessageQueue fleetClientQueue;


   
    private static CartRepository instance = null;

    public static CartRepository Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new CartRepository();
            }
            return instance;
        }
    }

    private void FleetClientQueue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {
        _cart = (Cart)e.Message.Body;
        expectedEchoReceived.Set();
    }

    public async Task<Cart> GetCartAsync()
    {
        MessageQueue fleetClientServiceQueue;
        fleetClientServiceQueue = new MessageQueue(".\\Private$\\FleetClientServiceQueue");
        fleetClientServiceQueue.Formatter = new BinaryMessageFormatter();
        fleetClientServiceQueue.Send("RequestCartInformation");
        expectedEchoReceived.Reset();
        expectedEchoReceived.WaitOne(5000);

      

        return _cart;
       
    }
}

这是我如何从 viewmodel 类调用单例类的方法的代码:

Cart = await CartRepository.Instance.GetCartAsync();

奇怪的是,第一次调用 GetCartAsync 方法时,ReceiveCompleted 事件触发得很好。之后由于某种原因,当我从应用程序中的另一个视图模型调用 GetCartAsync 时,不会触发 ReceiveCompleted 事件。我可以在计算机管理中看到进入该队列的消息,它们只是不断累积在队列中,因为看起来它们没有被单例订阅事件处理。

如果我能对正在发生的事情有所了解,请。

标签: c#singletonmsmq

解决方案


你只得到这个回调一次的原因是你只调用了BeginReceive一次。它只消耗队列中的一项。

要在回调中继续消费调用BeginReceive

private void FleetClientQueue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
    _cart = (Cart)e.Message.Body;
    expectedEchoReceived.Set();
    // Restart the asynchronous receive operation.
    fleetClientQueue.BeginReceive();
}

这是文档中列出的方法:


推荐阅读