共用方式為


使用主旨

Subject < T > 類型會實作 IObservable < T > 和 IObserver < T > ,也就是說,它是觀察者和可觀察的。 您可以使用主體來訂閱所有觀察者,然後訂閱後端資料來源的主體。 如此一來,主體就可以做為訂閱者群組和來源的 Proxy。 您可以使用主旨來實作具有快取、緩衝和時間轉移的自訂可觀察專案。 此外,您可以使用主旨將資料廣播給多個訂閱者。

根據預設,主旨不會跨執行緒執行任何同步處理。 它們不會採用排程器,而是假設主旨的呼叫端會處理所有序列化和文法正確性。  主旨只會廣播給安全線程訂閱者清單中的所有訂閱觀察者。 這樣做的優點是降低額外負荷並改善效能。 不過,如果您想要使用排程器將撥出電話同步處理給觀察者,您可以使用 Synchronize 方法來執行此動作。

使用主旨

在下列範例中,我們會建立主旨、訂閱該主體,然後使用相同的主體將值發佈至觀察者。 如此一來,我們會將發行集和訂閱合併成相同的來源。

除了採用 IObserver < T > 之外,Subscribe 方法也有一個多載,它會針對 onNext 採用 Action < T > ,這表示每次發佈專案時都會執行動作。 在我們的範例中,每當叫用 OnNext 時,專案就會寫入主控台。

Subject<int> subject = new Subject<int>();
var subscription = subject.Subscribe(
                         x => Console.WriteLine("Value published: {0}", x),
                         () => Console.WriteLine("Sequence Completed."));
subject.OnNext(1);

subject.OnNext(2);

Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subscription.Dispose();

下列範例說明主體的 Proxy 和廣播本質。 我們會先建立一個來源序列,每 1 秒產生一個整數。 然後,我們會建立 Subject,並將它當做觀察者傳遞至來源,以便接收此來源序列所推送的所有值。 之後,我們會建立另一個兩個訂用帳戶,這次會使用主體作為來源。 然後, subSubject1subSubject2 訂用帳戶將會收到主體從來源) 傳遞 (的任何值。

var source = Observable.Interval(TimeSpan.FromSeconds(1));
Subject<long> subject = new Subject<long>();
var subSource = source.Subscribe(subject);
var subSubject1 = subject.Subscribe(
                         x => Console.WriteLine("Value published to observer #1: {0}", x),
                         () => Console.WriteLine("Sequence Completed."));
var subSubject2 = subject.Subscribe(
                         x => Console.WriteLine("Value published to observer #2: {0}", x),
                         () => Console.WriteLine("Sequence Completed."));
Console.WriteLine("Press any key to continue");
Console.ReadKey();
subject.OnCompleted();
subSubject1.Dispose();
subSubject2.Dispose();

不同類型的主旨

Rx 程式庫中的 Subject < T > 類型是 ISubject < T > 介面的基本實作, (您也可以實作 ISubject < T > 介面來建立您自己的主旨類型) 。 ISubject < T > 的其他實作提供不同的功能。 所有這些類型都會儲存一些 (或所有透過 OnNext 推送至它們的) 值,並將其廣播回觀察者。 如此一來,它們會將熱可觀察轉換成冷的。 這表示,如果您訂閱上述任一項以上 (亦即訂閱 - > 取消訂閱 - 再次訂閱) > ,您至少會看到其中一個相同的值。 如需經常性與冷可觀察專案的詳細資訊,請參閱 建立和訂閱簡單可觀察序列 主題的最後一節。

ReplaySubject 會儲存它已發佈的所有值。 因此,當您訂閱時,您會自動收到已發行值的整個歷程記錄,即使您的訂用帳戶在推送特定值之後可能已傳入。行為 Subject 類似于 ReplaySubject,不同之處在于它只會儲存它發佈的最後一個值。 在初始化時,行為Subject也需要類型 T 的預設值。 當主體尚未收到其他值時,這個值會傳送給觀察者。 這表示,除非主旨已完成,否則所有訂閱者都會立即在訂閱上收到值。 AsyncSubject 與 Replay 和 Behavior 主旨類似,不過只會儲存最後一個值,並且只在序列完成時發佈它。 您可以在來源可觀察性作用時使用 AsyncSubject 類型,而且可能會在任何觀察者可以訂閱之前完成。 在此情況下, AsyncSubject 仍然可以提供最後一個值,並將它發佈至任何未來的訂閱者。