【发布时间】:2021-01-23 22:00:45
【问题描述】:
我有一个这样的应用架构:
当 UDP 服务中的 UDP 服务器接收到不同类型的消息时,它会将 Prism 事件发布给管理器。这些 UDP 服务器有自己的线程,所以当事件发布时,它们有时会导致管理器内部出现多线程问题。
为了防止我想在订阅管理器中创建一个事件处理程序和队列。当订阅者收到一个事件时,它唯一的工作就是尝试将事件有效负载排队到管理器内部的 ConcurrentQueue 并返回(我认为这称为存储和转发)。然后我会有一个工作人员读取这个队列并将事件参数发送到相关方法。 每个管理器都有自己的事件队列、事件处理程序和工作人员。
我的“事件队列”:
但是当我尝试实现这一点时,我无法解决一些问题:
1-订阅事件时public class TestEvent1 : PubSubEvent<Class1>,像这样GetEvent<TestEvent1>().Subscribe(OnTestEvent1),回调方法(OnTestEvent1)必须和事件的参数类型相同,在这种情况下Class1,OnTestEvent1(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- 我尝试使用 object 或 dynamic 类型,但我将失去编译时安全性。
2- 我想创建一个 interface 并在我所有的自定义类上实现它,这样我就可以将它用于一般类型,但是对于带有内置类型的事件该怎么办?
PS:我还有一个关于这个的问题,但我觉得我没有清楚地解释自己,所以我再次尽力了。
【问题讨论】:
标签: c# wpf events prism eventaggregator