【问题标题】:How to implement Prism EventAggregator event queue on subscribers如何在订阅者上实现 Prism EventAggregator 事件队列
【发布时间】:2021-01-23 22:00:45
【问题描述】:

我有一个这样的应用架构:

当 UDP 服务中的 UDP 服务器接收到不同类型的消息时,它会将 Prism 事件发布给管理器。这些 UDP 服务器有自己的线程,所以当事件发布时,它们有时会导致管理器内部出现多线程问题。

为了防止我想在订阅管理器中创建一个事件处理程序和队列。当订阅者收到一个事件时,它唯一的工作就是尝试将事件有效负载排队到管理器内部的 ConcurrentQueue 并返回(我认为这称为存储和转发)。然后我会有一个工作人员读取这个队列并将事件参数发送到相关方法。 每个管理器都有自己的事件队列、事件处理程序和工作人员。

我的“事件队列”:

但是当我尝试实现这一点时,我无法解决一些问题:

1-订阅事件时public class TestEvent1 : PubSubEvent<Class1>,像这样GetEvent<TestEvent1>().Subscribe(OnTestEvent1),回调方法(OnTestEvent1)必须和事件的参数类型相同,在这种情况下Class1OnTestEvent1(Class1 class1) .我需要一个类型来存储每个接收到的数据和事件类型。

如何对订阅管理器中的所有不同类型的事件使用相同的回调方法?

例子:

// Events
public class TestEvent1 : PubSubEvent<Class1>
{
}
public class TestEvent2 : PubSubEvent<Class2>
{
}
public class TestEvent3 : PubSubEvent<List<Class3>>
{
}

// Subscriptions
_eventAggregator.GetEvent<TestEvent1>().Subscribe(EventHandler, true);
_eventAggregator.GetEvent<TestEvent2>().Subscribe(EventHandler, true); 
_eventAggregator.GetEvent<TestEvent3>().Subscribe(EventHandler, true);

// Callback
private void EventHandler("What's inside here?")
{
    _eventQueue.Enqueue(payload);
    return;     
}

2- 由于我想将管理器接收到的所有事件存储在单个队列中,同样类型的问题也适用于此,创建 ConcurrentQueue 时我的T 应该是什么?

3- 这可行吗?有没有其他方法、模式(我找到了中介,但研究得不够深入)我可以这样使用?

我尝试了什么:

1- 我尝试使用 objectdynamic 类型,但我将失去编译时安全性。

2- 我想创建一个 interface 并在我所有的自定义类上实现它,这样我就可以将它用于一般类型,但是对于带有内置类型的事件该怎么办?

PS:我还有一个关于这个的问题,但我觉得我没有清楚地解释自己,所以我再次尽力了。

【问题讨论】:

    标签: c# wpf events prism eventaggregator


    【解决方案1】:

    如何对订阅管理器中的所有不同类型的事件使用相同的回调方法?

    你没有。事件聚合器不是这样设计的。事件的类型用于区分订阅并将事件分发给真正需要它的订阅者,因此您只能订阅单个事件类型。

    如前所述,您根本不应该在这里使用事件聚合器,因为有更好的工具可以帮助您实现目标。

    因为我想将经理接收到的所有事件都存储在单个队列中

    例如,如果管理器是一个数据流ActionBlock,它将预装一个功能齐全的队列。

    【讨论】:

    • 好的,除了Dataflow还有其他选择吗?
    • @Cagurtay 在我的另一个答案中,我命名了您可以使用的四个不同的生产者-消费者队列。在我看来(虽然不知道您的任何要求)数据流在这里很合适,尤其是预设置图中的类似网格的并发处理。
    • 您的意思是BlockingCollection'BufferBlockAsyncProducerConsumerQueue 还是AsyncCollection,?它们与ConcurrentQueue 有什么区别?难道我还不需要为每种类型的活动创建不同的商店吗?谢谢你的数据流,我会研究并尝试实现它。
    • @Cagurtay 它们在提供的 API 和可用的平台上有所不同。是的,当然,它们都存储一种类型(加上它的派生类型)。但是,如果每个经理都处理一种传入类型的事件,那应该没那么重要。
    • @Cagurtay 但目前我的经理处理多种类型的事件,我试图在“架构”图上显示它,经理 C 订阅了 3 个不同的事件,这些事件传递了 3 种不同类型的数据。我的目标是将每个订阅的事件排队到一个队列中,然后一个一个地处理它们。我不想为每种事件类型创建一个新队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多