线程安全发布订阅.Net
我创建了一组简单的接口和一个类,允许我发布通用字典中项目的添加和删除。订阅者在订阅时会收到整个列表,之后他们只会收到更改。线程安全发布订阅.Net
尽管我的解决方案有效,但我正在寻找一些更标准的东西,少一些本土的东西。你有什么建议吗?
什么我发现迄今注:
我一直在寻找微软的反应扩展器(Rx)。根据Jon Skeet的文章“LINQ to Rx:second impressions”[1],他说:“只要观察者订阅,observable就会按顺序发布所有内容(在不同的线程上,默认情况下)。让可观察的元素多次遍历序列。“这听起来像是基本的想法,但我找不到任何具体的例子,而且我对“主题”或“AsyncSubject”的线程安全性还不确定。
说明我家种解决方案:
被输送到用户的结构是这样的:
/// <summary>
/// Interface for a set of changes that are being published.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TItem"></typeparam>
public interface IPublication<TKey, TItem>
{
/// <summary>
/// Version of the list.
/// </summary>
long Version { get; }
/// <summary>
/// Items that were added or updated.
/// </summary>
IEnumerable<TItem> ChangedItems { get; }
/// <summary>
/// Keys to items that were removed.
/// </summary>
IEnumerable<TKey> RemovedKeys { get; }
}
用户本身必须实现此接口:
/// <summary>
/// Interface for a subscriber that will receive IPublication{TKey, TItem} deliveries from a publisher.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TItem"></typeparam>
public interface ISubscribe<TKey, TItem>
{
void Deliver(IPublication<TKey, TItem> pub);
}
当然,我的通用字典发布者类有这种方法:
/// <summary>
/// Adds the give subscriber to the list of subscribers and immediately publishes the
/// dictionary contents to the new subscriber. The return value may be disposed when
/// the subscriber wishes to terminate it's subscription.
/// </summary>
/// <param name="subscriber"></param>
/// <returns></returns>
public IDisposable Subscribe(ISubscribe<TKey, TItem> subscriber);
[1] http://msmvps.com/blogs/jon_skeet/archive/2010/01/19/linq-to-rx-second-impressions.aspx
这是不是一个真正的答案,但繁琐的投入的意见,以便把它在这里... 不知道为什么你在看一个标准出匣解决方案何时您的自定义解决方案易于构建并可以工作?事件是实现发布者 - 订阅者模型的最简单(和标准)的方式,但它们不是线程安全的,并且也受到订阅者和发布者之间紧密耦合的影响。 MS模式&练习组发布了基于WCF的pattern,但我认为您正在寻找快速进程中的代码。同样,许多其他标准的发布 - 订阅解决方案将针对应用程序集成(ESB)。 如果您没有找到任何替代方案并决定使用您的定制解决方案,那么您可以参考此artcile描述实现此设计模式时遇到的问题。
感谢您的回答。如果我不需要,我尽量不要重新发明轮子。也许我会写一篇关于我的实现的博客文章。那么,我肯定会让很多人告诉我它有什么问题! – 2010-08-17 06:46:30
由于您的评论帮助我,我会给你答案。我将这里使用的代码放在http://code.google.com/p/waynescode/source/browse/#svn/trunk/Wc.DotNetCode/Wc.Common/PubSub – 2010-08-18 17:49:00
您应该深入研究Rx,并考虑在DevLabs Rx论坛上提出您的问题:http://social.msdn.microsoft.com/Forums/en-US/rx/threads – 2010-08-17 07:22:45
谢谢理查德。会做。 – 2010-08-17 17:09:43