Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在订阅服务器上实现Prism EventAggregator事件队列_C#_Wpf_Events_Prism_Eventaggregator - Fatal编程技术网

C# 如何在订阅服务器上实现Prism EventAggregator事件队列

C# 如何在订阅服务器上实现Prism EventAggregator事件队列,c#,wpf,events,prism,eventaggregator,C#,Wpf,Events,Prism,Eventaggregator,我的应用程序架构如下: 当UDP服务中的UDP服务器接收到不同类型的消息时,它会将Prism事件发布给管理器。这些UDP服务器有自己的线程,因此当事件发布时,它们有时会在管理器内部引起多线程问题 为了避免这种情况,我想在订阅管理器中创建一个事件处理程序和队列。当订阅者接收到事件时,它唯一的任务是尝试将事件负载排队到管理器内的ConcurrentQueue并返回(我认为这称为存储转发)。然后我将有一个工作进程来读取这个队列,并将事件参数发送给相关的方法。 每个管理器都有自己的事件队列、事件处理程

我的应用程序架构如下:

当UDP服务中的UDP服务器接收到不同类型的消息时,它会将Prism事件发布给管理器。这些UDP服务器有自己的线程,因此当事件发布时,它们有时会在管理器内部引起多线程问题

为了避免这种情况,我想在订阅管理器中创建一个事件处理程序和队列。当订阅者接收到事件时,它唯一的任务是尝试将事件负载排队到管理器内的ConcurrentQueue并返回(我认为这称为存储转发)。然后我将有一个工作进程来读取这个队列,并将事件参数发送给相关的方法。 每个管理器都有自己的事件队列、事件处理程序和工作程序

我的“事件队列”:

但当我试图实现这一点时,我无法克服一些问题:

1-订阅事件时,
public类TestEvent1:PubSubEvent
,类似这样,
GetEvent().subscribe(OnTestEvent1)
,回调方法(
OnTestEvent1
)必须具有相同类型的事件参数,在这种情况下,
Class1
OnTestEvent1(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;     
}
//事件
公共类TestEvent1:PubSubEvent
{
}
公共类TestEvent2:PubSubEvent
{
}
公共类TestEvent3:PubSubEvent
{
}
//订阅
_eventAggregator.GetEvent().Subscribe(EventHandler,true);
_eventAggregator.GetEvent().Subscribe(EventHandler,true);
_eventAggregator.GetEvent().Subscribe(EventHandler,true);
//回拨
私有void EventHandler(“这里有什么?”)
{
_排队(有效负载);
返回;
}
2-由于我希望在单个队列中存储管理器的所有接收事件,同样的类型问题也适用于此,因此在创建ConcurrentQueue时,我的
T
应该是什么

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

我尝试的是:

1-我试图使用
对象
动态
类型,但这样我将失去编译时安全性

2-我想创建一个
接口
,并在我所有的自定义类上实现它,这样我就可以将它用于常规类型,但是如何处理内置类型的事件呢

PS:关于这一点,我还有一个问题,但我觉得我没有解释清楚,所以我再次尽了最大努力

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

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

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

因为我想在单个队列中存储管理器的所有接收事件


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

好的,除了数据流之外还有其他替代方案吗?@Cagurtay在我的另一个回答中,我列出了四个可以使用的不同的生产者-消费者队列。在我看来(虽然我不知道您的任何需求),数据流在这里非常适合,尤其是预设置图中类似网格的并发处理。您是指
BlockingCollection
'BufferBlock
AsyncProducerConsumerQueue
还是
AsyncCollection
?它们与
ConcurrentQueue
有什么区别?我是否仍然需要为每种类型的活动创建不同的存储?感谢您提供的数据流,我将研究并尝试实现它。@Cagurtay它们在提供的API和可用的平台上有所不同。当然,它们都存储一个类型(加上它的派生类型)。但是,如果每个管理器处理一种传入类型的事件,这应该没有多大关系。@Cagurtay但目前我的管理器处理多种类型的事件,我试图在“架构”图上显示它,管理器C订阅了3个不同的事件,传递3种不同类型的数据。我的目标是将每个订阅的事件排队到单个队列中,然后逐个处理它们。我不想为每种事件类型创建一个新队列。