簡體   English   中英

NET中的線程安全發布訂閱

[英]Thread Safe Publish Subscribe in .Net

我創建了一組簡單的接口和一個類,使我可以在通用字典中發布項目的添加和刪除。 訂閱者在訂閱時會收到整個列表,此后,他們只會獲得更改。

盡管我的解決方案有效,但我正在尋找一些更標准,更便宜的產品。 你有什么建議嗎?

關於我到目前為止發現的注釋:

我一直在研究Microsoft的反應性擴展(Rx)。 根據喬恩·斯凱特(Jon Skeet)的文章“ LINQ to Rx:第二印象” [1],他說:“觀察者一訂閱,可觀察對象就會立即按順序發布所有內容(默認情況下,它在另一個線程上)。分別調用訂閱使可觀察的對象遍歷整個序列多次。” 這聽起來像是基本思路,但是我找不到任何具體示例,而且我不確定“ Subject”或“ 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] https://codeblog.jonskeet.uk/2010/01/19/linq-to-rx-second-impressions/

這不是一個真正的答案,但是要在評論中添加內容很繁瑣,因此將其放在此處...不知道為什么您的自定義解決方案易於構建並且可以正常工作時,為什么要使用標准的現成解決方案? 事件是實現發布者-訂閱者模型的最簡單(和標准)方式,但是它們不是線程安全的,並且還遭受訂閱者和發布者之間的緊密耦合。 MS模式和實踐小組已經發布了基於WCF的模式,但是我認為您正在尋找一種快速的進程內代碼。 同樣,許多其他標准的發布-訂閱解決方案將以應用程序集成(ESB)為目標。 如果您找不到其他選擇並決定使用自定義解決方案,那么您可以參考該文章來描述實現此設計模式中的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM