c# - 单例类触发事件只有一次
问题描述
我是新编写单例类,但我遇到了一种奇怪的行为。在我的单身课程中,我有一个只触发一次的事件。此事件是 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 事件。我可以在计算机管理中看到进入该队列的消息,它们只是不断累积在队列中,因为看起来它们没有被单例订阅事件处理。
如果我能对正在发生的事情有所了解,请。
解决方案
你只得到这个回调一次的原因是你只调用了BeginReceive
一次。它只消耗队列中的一项。
要在回调中继续消费调用BeginReceive
:
private void FleetClientQueue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
_cart = (Cart)e.Message.Body;
expectedEchoReceived.Set();
// Restart the asynchronous receive operation.
fleetClientQueue.BeginReceive();
}
这是文档中列出的方法:
推荐阅读
- c# - Microsoft Forms 停靠在左上角。C#
- python - Selenium:如何从“find_elements”列表中单击单个项目
- react-native - 反应原生buttons.slice不是一个函数
- python - 何时在 multiprocessing.Pool 上使用 multiprocessing.Queue?什么时候需要使用 multiprocessing.Queue?
- python - 在文件 (10MB+) 中搜索出现在相似上下文中的关键字(<512 字长)
- swiftui - 如何解决“不接受通知”。您可以稍后在 iOS 设置的问题下打开它们?
- sql - PostgreSQL 每月平均参加活动的人数
- android - 有没有办法在 Android Emulator 中使用系统 OpenGL ES 实现?
- r - 有没有一种很好的方法可以将字符列转换为有序因子?
- r - 计算一列中有多少字符出现在另一列中