Jon Skeet Singleton和EventAggregator

时间:2014-02-13 18:34:43

标签: c# multithreading events caliburn.micro eventaggregator

为了简单的模块间通信,存在经典的.NET事件,但现在有太多事件,并且存在通过模块相互调用的事件链。

与触发Event_A的{​​{1}}触发Event_B一样。

Event_C对于一个模块中的解耦通信非常方便,所以我试过了 带有EventAggregator的小“Jon Skeet Singleton IV”打破了那些EventAggregator链。 Jon Skeet on C# singletons can be found here

他告诉它是线程安全的,但他的例子只是暴露了一个Singleton资源。

这是我的代码

event

现在我可以在每个模块中使用此public static class GlobalEventAggregator { private static readonly IEventAggregator EventAggregator = new EventAggregator(); // tell C# compiler not to mark type as beforefieldinit static GlobalEventAggregator() { } public static void Subscribe(object instance) { EventAggregator.Subscribe(instance); } public static void Unsubscribe(object instance) { EventAggregator.Unsubscribe(instance); } public static void Publish(object message) { EventAggregator.Publish(message); } } 来发布事件和 对这些事件感兴趣的每个其他模块都可以愉快地处理它们。 没有更多的链接。

但是我会遇到多线程问题吗?其他模块有不同的线程,我想在其中发布事件。调度应该不是问题。 我应该在公共方法中使用GlobalEventAggregator吗?

我无法判断这些方法是否是线程安全的,无法找到相关的文档。

1 个答案:

答案 0 :(得分:2)

EventAggregator已经锁定,因此你的GlobalEventAggregator不需要。 http://caliburnmicro.codeplex.com/SourceControl/latest#src/Caliburn.Micro/EventAggregator.cs

有点不相关,但推荐的访问单身的方法是DI