共用方式為


ISubject < TSource、 TResult > 介面

表示同時為可觀察序列和觀察者的物件。

Namespace:System.Reactive.Subjects
裝配: System.Reactive.dll) 中的 System.Reactive (

Syntax

'Declaration
Public Interface ISubject(Of In TSource, Out TResult) _
    Inherits IObserver(Of TSource), IObservable(Of TResult)
'Usage
Dim instance As ISubject(Of In TSource, Out TResult)
public interface ISubject<in TSource, out TResult> : IObserver<TSource>, 
    IObservable<TResult>
generic<typename TSource, typename TResult>
public interface class ISubject : IObserver<TSource>, 
    IObservable<TResult>
type ISubject<'TSource, 'TResult> =  
    interface
        interface IObserver<'TSource>
        interface IObservable<'TResult>
    end
JScript does not support generic types and methods.

類型參數

  • inTSource
    來源的類型。

    這是反變數的型別參數。 也就是說,您可以使用您指定的類型,或衍生程度較低的任何類型。 如需共變數和反變數的詳細資訊,請參閱

  • outTResult
    結果的類型。

    這是共變數的型別參數。 也就是說,您可以使用您指定的類型,或衍生程度較高的任何類型。 如需共變數和反變數的詳細資訊,請參閱

ISubject < TSource、TResult > 類型會公開下列成員。

方法

  名稱 描述
方法 OnCompleted (繼承自IObserver< TSource > .)
方法 OnError (繼承自IObserver< TSource > .)
方法 OnNext (繼承自IObserver< TSource > .)
方法 訂閱 (繼承自IObservable< TResult > .)

頂端

擴充方法

  名稱 描述
公用擴充方法 匯總 < TResult > (Func < TResult、TResult、TResult >) 多載。 將累積函數套用至可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 匯總 < TResult、TAccumulate (TAccumulate > 、Func < TAccumulate、TResult、TAccumulate >) 多載。 將累積函數套用至具有指定種子值的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 所有 < TResult> 判斷可觀察序列的所有專案是否符合條件。 由 Observable.) 定義的 (
公用擴充方法 Amb < TResult> 傳播可觀察序列,此序列會先回應指定的第一個和第二個序列。 由 Observable.) 定義的 (
公用擴充方法 和 < TResult、TRight> 當兩個可觀察序列都有可用的值時相符。 由 Observable.) 定義的 (
公用擴充方法 任何 < TResult > () 多載。 判斷可觀察序列是否包含任何專案。 由 Observable.) 定義的 (
公用擴充方法 任何 < TResult > (Func < TResult、Boolean >) 多載。 判斷可觀察序列的所有專案是否符合條件。 由 Observable.) 定義的 (
公用擴充方法 AsObservable < TResult> 隱藏可觀察序列的識別。 由 Observable.) 定義的 (
公用擴充方法 AsObserver < TSource> 隱藏觀察者的身分識別。 由 Observer.) 定義的 (
公用擴充方法 AsQbservable < TResult> 將可觀察序列轉換成可查詢的可觀察序列。 由 Qbservable.) 定義的 (
公用擴充方法 AssertEqual < TResult> 由 Extensions.) 定義的 (
公用擴充方法 Buffer < TResult > (Int32) 多載。 將可觀察序列的每個元素指出為連續的非重迭緩衝區,這些緩衝區會根據專案計數資訊產生。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan) 多載。 將可觀察序列的每個元素,指出根據計時資訊產生的連續非重迭緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (Int32、Int32) 多載。 會根據專案計數資訊,將可觀察序列的每個元素指出為零或多個緩衝區所產生的緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan、IScheduler) 多載。 會根據計時資訊,將可觀察序列的每個元素指出為連續的非重迭緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan、TimeSpan) 多載。 會根據計時資訊,將可觀察序列的每個元素指出為零個或多個緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan、Int32) 多載。 將可觀察序列的每個元素指出為已滿或已經過指定時間量時所傳送的緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan、 TimeSpan、 IScheduler) 多載。 會根據計時資訊,將可觀察序列的每個元素指出為零個或多個緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult > (TimeSpan、Int32、IScheduler) 多載。 將可觀察序列的每個元素指出為已滿或已經過指定時間量時所傳送的緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult、TBufferClosing (Func < IObservable < TBufferClosing >>>) 多載。 將可觀察序列的每個元素指出為連續的非重迭緩衝區。 由 Observable.) 定義的 (
公用擴充方法 Buffer < TResult、TBufferOpening、TBufferClosing > (IObservable < TBufferOpening > 、Func < TBufferOpening、IObservable < TBufferClosing >>) 多載。 將可查詢的可觀察序列的每個元素指出為連續的非重迭緩衝區。 由 Observable.) 定義的 (
公用擴充方法 攔截 < TResult > (IObservable < TResult >) 多載。 繼續以下一個可觀察序列的例外狀況終止的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Catch < TResult、TException (Func < TException > 、IObservable < TResult >>) 多載。 使用處理程式所產生的可觀察序列,繼續以指定型別的例外狀況終止的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 CombineLatest < TResult、TSecond、TResult> 每當其中一個可觀察序列產生元素時,使用選取器函式,將兩個可觀察序列合併成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Concat < TResult> 串連兩個可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 包含 < TResult (TResult >) 多載。 使用預設相等比較子,判斷可觀察序列是否包含指定的專案。 由 Observable.) 定義的 (
公用擴充方法 包含 < TResult (TResult > 、IEqualityComparer < TResult >) 多載。 使用指定的 System.Collections.Generic.IEqualityComparer & lt,判斷可觀察序列是否包含指定的專案;T & gt;。 由 Observable.) 定義的 (
公用擴充方法 Count < TResult> 會傳回 Int32 ,代表可觀察序列中的元素總數。 由 Observable.) 定義的 (
公用擴充方法 DefaultIfEmpty < TResult > () 多載。 如果序列是空的,則會傳回指定序列的專案或類型參數的預設值。 由 Observable.) 定義的 (
公用擴充方法 DefaultIfEmpty < TResult (TResult >) 多載。 如果序列是空的,則會傳回指定序列的專案或類型參數的預設值。 由 Observable.) 定義的 (
公用擴充方法 Delay < TResult > (TimeSpan) 多載。 使用指定的來源和 dueTime,依到期時間指出可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 Delay < TResult > (DateTimeOffset) 多載。 使用指定的來源和 dueTime,依到期時間指出可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 Delay < TResult > (TimeSpan、 IScheduler) 多載。 使用指定的來源、dueTime 和排程器,依到期時間指出可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 Delay < TResult > (DateTimeOffset、IScheduler) 多載。 使用指定的來源、dueTime 和排程器,依到期時間指出可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 Distinct < TResult > () 多載。 傳回只包含具有指定來源之相異專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Distinct < TResult > (IEqualityComparer < TResult >) 多載。 傳回可觀察的序列,這個序列只會根據比較子包含相異專案。 由 Observable.) 定義的 (
公用擴充方法 Distinct < TResult、TKey > (Func < TResult、TKey >) 多載。 根據 keySelector 傳回只包含相異專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Distinct < TResult、TKey > (Func < TResult、TKey、IEqualityComparer < TKey >>) 多載。 根據 keySelector 傳回只包含相異專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 DistinctUntilChanged < TResult > () 多載。 傳回只包含具有指定來源之相異連續專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 DistinctUntilChanged < TResult > (IEqualityComparer < TResult >) 多載。 傳回可觀察的序列,這個序列只會根據比較子包含相異連續的專案。 由 Observable.) 定義的 (
公用擴充方法 DistinctUntilChanged < TResult、TKey > (Func < TResult、TKey >) 多載。 根據 keySelector 傳回只包含相異連續專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 DistinctUntilChanged < TResult, TKey > (Func < TResult, TKey, IEqualityComparer < TKey >>) 多載。 根據 keySelector 和比較子,傳回只包含相異連續專案的可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Do < TResult (Action < TResult >>) 多載。 針對可觀察序列中的每個專案叫用動作。 由 Observable.) 定義的 (
公用擴充方法 Do < TResult > (IObserver < TResult >) 多載。 針對可觀察序列中的每個專案叫用動作,並在可觀察序列的例外終止時叫用動作。 由 Observable.) 定義的 (
公用擴充方法 Do < TResult > (Action TResult > , Action <) 多載。 針對可觀察序列中的每個專案叫用動作,並在可觀察序列的正常終止時叫用動作。 由 Observable.) 定義的 (
公用擴充方法 Do < TResult (Action TResult >> , Action << Exception >) 多載。 針對可觀察序列中的每個專案叫用動作,並在可觀察序列的例外終止時叫用動作。 由 Observable.) 定義的 (
公用擴充方法 Do < TResult (Action TResult >> , Action < Exception > , Action <) 多載。 針對可觀察序列中的每個專案叫用動作,並在可觀察序列的正常或例外終止時叫用動作。 由 Observable.) 定義的 (
公用擴充方法 ElementAt < TResult> 傳回位於序列中指定索引處的項目。 由 Observable.) 定義的 (
公用擴充方法 ElementAtOrDefault < TResult> 傳回位於序列中指定索引處的元素;如果索引超出範圍,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 <最後 TResult> 在來源可觀察序列正常終止或由例外狀況終止之後,叫用指定的動作。 由 Observable.) 定義的 (
公用擴充方法 第一個 < TResult > () 多載。 傳回具有指定來源之可觀察序列的第一個專案。 由 Observable.) 定義的 (
公用擴充方法 第一個 < TResult > (Func < TResult,布林值 >) 多載。 傳回符合述詞之可觀察序列的第一個專案。 由 Observable.) 定義的 (
公用擴充方法 FirstOrDefault < TResult > () 多載。 傳回可觀察序列的第一個專案,如果沒有找到任何值,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 FirstOrDefault < TResult (Func < TResult > , Boolean >) 多載。 傳回符合述詞之可觀察序列的第一個專案,如果沒有找到任何值,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 Foo < TResult, R> 由 MyExt.) 定義的 (
公用擴充方法 ForEach < TResult> 叫用可觀察序列中每個專案的動作,並封鎖直到序列終止為止。 由 Observable.) 定義的 (
公用擴充方法 GetEnumerator < TResult> 傳回列舉值,列舉可觀察序列的所有值。 由 Observable.) 定義的 (
公用擴充方法 GroupBy < TResult、TKey > (Func < TResult、TKey >) 多載。 根據指定的索引鍵選取器函式,將可觀察序列的專案分組。 由 Observable.) 定義的 (
公用擴充方法 GroupBy < TResult、TKey > (Func < TResult、TKey、IEqualityComparer < TKey >>) 多載。 根據指定的索引鍵選取器函式和比較子,將可觀察序列的專案分組。 由 Observable.) 定義的 (
公用擴充方法 GroupBy < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement >) 多載。 將可觀察序列的元素分組,並使用指定的函式來選取產生的專案。 由 Observable.) 定義的 (
公用擴充方法 GroupBy < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement > 、IEqualityComparer < TKey >) 多載。 根據指定的索引鍵選取器函式和比較子,將可觀察序列的專案分組,並使用指定的函式來選取產生的元素。 由 Observable.) 定義的 (
公用擴充方法 GroupByUntil < TResult, TKey, TDuration > (Func < TResult, TKey > , Func < IGroupedObservable < TKey, TResult > , IObservable < TDuration >>) 多載。 根據指定的索引鍵選取器函式,將可觀察序列的專案分組。 由 Observable.) 定義的 (
公用擴充方法 GroupByUntil < TResult, TKey, TDuration (Func < TResult, TKey > , Func < IGroupedObservable < TKey, TResult > , IObservable < TDuration >>> , IEqualityComparer < TKey >) 多載。 根據指定的索引鍵選取器函式和比較子,將可觀察序列的專案分組。 由 Observable.) 定義的 (
公用擴充方法 GroupByUntil < TResult, TKey, TElement, TDuration > (Func TResult, TKey > , Func < TResult, TElement > , Func << IGroupedObservable < TKey, TElement > , IObservable < TDuration >>) 多載。 根據指定的索引鍵選取器函式,將可觀察序列的專案分組,並使用指定的函式來選取產生的元素。 由 Observable.) 定義的 (
公用擴充方法 GroupByUntil < TResult, TKey, TElement, TDuration (Func TResult, TKey > , Func < TResult, TElement > , Func << IGroupedObservable < TKey, TElement > , IObservable < TDuration >>> , IEqualityComparer < TKey >) 多載。 根據指定的索引鍵選取器函式和比較子,將可觀察序列的專案分組,並使用指定的函式來選取產生的元素。 由 Observable.) 定義的 (
公用擴充方法 GroupJoin < TResult、TRight、TLeftDuration、TRightDuration、TResult> 根據重迭的持續時間,將兩個序列的專案相互關聯,並將結果分組。 由 Observable.) 定義的 (
公用擴充方法 IgnoreElements < TResult> 忽略可觀察序列中的所有值,只留下終止訊息。 由 Observable.) 定義的 (
公用擴充方法 Join < TResult、TRight、TLeftDuration、TRightDuration、TResult> 根據重迭持續時間,將兩個序列的專案相互關聯。 由 Observable.) 定義的 (
公用擴充方法 Last < TResult > () 多載。 傳回具有指定來源之可觀察序列的最後一個專案。 由 Observable.) 定義的 (
公用擴充方法 Last < TResult > (Func < TResult, Boolean >) 多載。 傳回符合述詞之可觀察序列的最後一個專案。 由 Observable.) 定義的 (
公用擴充方法 LastOrDefault < TResult > () 多載。 傳回可觀察序列中的最後一個專案,如果沒有找到任何值,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 LastOrDefault < TResult (Func < TResult > , Boolean >) 多載。 傳回符合述詞之可觀察序列的最後一個專案,如果找不到任何值,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 最新 < TResult> 取樣可觀察序列中最新的值。 由 Observable.) 定義的 (
公用擴充方法 LongCount < TResult> 會傳回 Int64 ,代表可觀察序列中的元素總數。 由 Observable.) 定義的 (
公用擴充方法 具體化 < TResult> 將可觀察序列的隱含通知具體化為明確的通知值。 由 Observable.) 定義的 (
公用擴充方法 Max < TResult > () 多載。 傳回可觀察序列中的最大元素。 由 Observable.) 定義的 (
公用擴充方法 最大 < TResult > (IComparer < TResult >) 多載。 根據指定的比較子傳回可觀察序列中的最大值。 由 Observable.) 定義的 (
公用擴充方法 MaxBy < TResult、TKey > (Func < TResult、TKey >) 多載。 傳回具有最大索引鍵值的可觀察序列中的專案。 由 Observable.) 定義的 (
公用擴充方法 MaxBy < TResult、TKey > (Func < TResult、TKey、IComparer < TKey >>) 多載。 傳回具有最大索引鍵值的可觀察序列中的專案。 由 Observable.) 定義的 (
公用擴充方法 合併 < TResult > (IObservable < TResult >) 多載。 將可觀察序列的可觀察序列合併成可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 合併 < TResult > (IObservable < TResult > 、IScheduler) 多載。 將兩個可觀察序列合併成單一可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Min < TResult > () 多載。 傳回可觀察序列中的最小專案。 由 Observable.) 定義的 (
公用擴充方法 Min < TResult > (IComparer < TResult >) 多載。 根據指定的比較子,傳回可觀察序列中的最小值。 由 Observable.) 定義的 (
公用擴充方法 MinBy < TResult、TKey > (Func < TResult、TKey >) 多載。 傳回具有最小索引鍵值的可觀察序列中的專案。 由 Observable.) 定義的 (
公用擴充方法 MinBy < TResult、TKey > (Func < TResult、TKey、IComparer < TKey >>) 多載。 根據指定的比較子,傳回具有最小索引鍵值的可觀察序列中的專案。 由 Observable.) 定義的 (
公用擴充方法 MostRecent < TResult> 以可觀察序列取樣最新的值。 由 Observable.) 定義的 (
公用擴充方法 多播 < TResult、TResult > (ISubject < TResult、TResult >) 多載。 傳回連接時可連線的可觀察序列,導致來源序列將結果推送至指定的主旨。 由 Observable.) 定義的 (
公用擴充方法 多播 < TResult、TIntermediate、TResult > (Func < ISubject < TResult、TIntermediate、Func < IObservable TIntermediate >>> 、IObservable << TResult >>) 多載。 傳回可觀察的序列,其中包含選取器函式內多播來源序列所產生的序列專案。 由 Observable.) 定義的 (
公用擴充方法 下一個 < TResult> 取樣下一個值 (封鎖,而不用在可觀察的序列中緩衝處理) 。 由 Observable.) 定義的 (
公用擴充方法 ObserveOn < TResult > (SynchronizationCoNtext) 多載。 以非同步方式在指定的同步處理內容上通知觀察者。 由 Observable.) 定義的 (
公用擴充方法 ObserveOn < TResult > (控制項) 多載。 由 ControlObservable.) 定義的 (
公用擴充方法 ObserveOn < TResult > (Dispatcher) 多載。 由 DispatcherObservable.) 定義的 (
公用擴充方法 ObserveOn < TResult > (DispatcherScheduler) 多載。 由 DispatcherObservable.) 定義的 (
公用擴充方法 ObserveOn < TResult > (IScheduler) 多載。 以非同步方式在指定的排程器上通知觀察者。 由 Observable.) 定義的 (
公用擴充方法 ObserveOnDispatcher < TResult> 由 DispatcherObservable.) 定義的 (
公用擴充方法 OnErrorResumeNext < TResult> 繼續以正常方式終止的可觀察序列,或以下一個可觀察序列的例外狀況終止。 由 Observable.) 定義的 (
公用擴充方法 Publish < TResult > () 多載。 傳回可連線的可觀察序列,此序列會將單一訂閱共用至基礎序列。 由 Observable.) 定義的 (
公用擴充方法 發佈 < TResult > (TResult) 多載。 傳回可連線的可觀察序列,此序列會將單一訂用帳戶共用至基礎序列,並以 initialValue 開頭。 由 Observable.) 定義的 (
公用擴充方法 發佈 < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >>) 多載。 傳回可觀察序列,這是在共用單一訂用帳戶至基礎序列之可連線可觀察序列上叫用選取器的結果。 由 Observable.) 定義的 (
公用擴充方法 發佈 < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult、TResult >>) 多載。 傳回可連線的可觀察序列,此序列會將單一訂用帳戶共用至基礎序列,並以 initialValue 開頭。 由 Observable.) 定義的 (
公用擴充方法 PublishLast < TResult > () 多載。 傳回可連線的可觀察序列,此序列會將單一訂用帳戶共用至僅包含最後一個通知的基礎序列。 由 Observable.) 定義的 (
公用擴充方法 PublishLast < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >>) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列只會共用包含最後一個通知之基礎序列的單一訂用帳戶。 由 Observable.) 定義的 (
公用擴充方法 重複 < TResult > () 多載。 無限期地重複可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 重複 < TResult > (Int32) 多載。 無限期地重複可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult > () 多載。 傳回可連線的可觀察序列,此序列會將單一訂用帳戶共用至基礎序列,以重新執行所有通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (TimeSpan) 多載。 傳回可連線的可觀察序列,此序列會將單一訂閱共用至基礎序列,以重新執行視窗內的所有通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (Int32) 多載。 傳回可連線的可觀察序列,此序列會共用單一訂閱給基礎序列重新執行 bufferSize 通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (IScheduler) 多載。 傳回可連線的可觀察序列,此序列會將單一訂用帳戶共用至基礎序列,以重新執行所有通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (TimeSpan、IScheduler) 多載。 傳回可連線的可觀察序列,此序列會將單一訂閱共用至基礎序列,以重新執行視窗內的所有通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (Int32、IScheduler) 多載。 傳回可連線的可觀察序列,此序列會共用單一訂閱給基礎序列重新執行 bufferSize 通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (Int32、TimeSpan) 多載。 傳回可連線的可觀察序列,此序列會共用單一訂閱給基礎序列重新執行 bufferSize 視窗中的通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult > (Int32、TimeSpan、IScheduler) 多載。 傳回可連線的可觀察序列,此序列會共用單一訂閱給基礎序列重新執行 bufferSize 視窗中的通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >>) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會共用基礎序列的單一訂用帳戶,並以初始值開頭。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、IScheduler) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會將單一訂用帳戶共用至基礎序列重新執行所有通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、TimeSpan) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會共用單一訂用帳戶給基礎序列,以重新執行視窗內的所有通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、Int32) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會將單一訂用帳戶共用至基礎序列重新執行 bufferSize 通知。 由 Observable.) 定義的 (
公用擴充方法 重新執行 < TResult、TResult (Func < IObservable TResult >> 、IObservable << TResult >> 、TimeSpan、IScheduler) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會共用單一訂用帳戶給基礎序列,以重新執行視窗內的所有通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、Int32、IScheduler) 多載。 傳回可觀察序列,這是叫用可連接可觀察序列上選取器的結果,該序列會將單一訂用帳戶共用至基礎序列重新執行 bufferSize 通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、Int32、TimeSpan) 多載。 傳回可觀察序列,這是在可連接可觀察序列上叫用選取器的結果,該序列會將單一訂用帳戶共用至基礎序列重新執行 bufferSize 視窗中的通知。 由 Observable.) 定義的 (
公用擴充方法 Replay < TResult、TResult > (Func < IObservable TResult > 、IObservable << TResult >> 、Int32、TimeSpan、IScheduler) 多載。 傳回可觀察序列,這是在可連接可觀察序列上叫用選取器的結果,該序列會將單一訂用帳戶共用至基礎序列重新執行 bufferSize 視窗中的通知。 由 Observable.) 定義的 (
公用擴充方法 重試 < TResult > () 多載。 重複來源可觀察序列,直到成功終止為止。 由 Observable.) 定義的 (
公用擴充方法 重試 < TResult > (Int32) 多載。 重複來源可觀察序列,直到成功終止為止。 由 Observable.) 定義的 (
公用擴充方法 範例 < TResult > (TimeSpan) 多載。 在每個間隔取樣可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 範例 < TResult > (TimeSpan、IScheduler) 多載。 使用指定的來源、間隔和排程器,在每個間隔取樣可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 範例 < TResult、TSample > (IObservable < TSample >) 多載。 使用指定的來源和取樣器,在取樣刻度時取樣可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 掃描 < TResult (Func < TResult > 、 TResult、 TResult >) 多載。 將累加器函式套用至可觀察序列,並使用指定的來源和累積器傳回每個中繼結果。 由 Observable.) 定義的 (
公用擴充方法 掃描 < TResult、TAccumulate (TAccumulate > 、Func < TAccumulate、TResult、TAccumulate >) 多載。 將累加器函式套用至可觀察序列,並傳回具有指定來源、種子和累積器的每個中繼結果。 由 Observable.) 定義的 (
公用擴充方法 選取 < TResult、TResult > (Func < TResult、TResult >) 多載。 使用指定的來源和選取器,將可觀察序列的每個專案投影成新的表單。 由 Observable.) 定義的 (
公用擴充方法 選取 < TResult、TResult > (Func < TResult、Int32、TResult >) 多載。 藉由將元素的索引與指定的來源和選取器併入,將可觀察序列的每個元素投影成新的表單。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TOther > (IObservable < TOther >) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TResult (Func < TResult > 、IObservable < TResult >>) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TResult (Func < TResult > 、IEnumerable < TResult >>) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TResult (Func < TResult > 、IObservable < TResult >> 、Func < Exception、IObservable TResult >> 、Func < IObservable << TResult >>) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TCollection、TResult (Func < TResult > 、IEnumerable < TCollection、Func < TResult、TCollection >> 、TResult >) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SelectMany < TResult、TCollection、TResult (Func < TResult > 、IObservable < TCollection、Func < TResult、TCollection >> 、TResult >) 多載。 將可觀察序列的每個元素投影到可觀察的序列,並將產生的可觀察序列扁平化成一個可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 SequenceEqual < TResult > (IObservable < TResult >) 多載。 藉由比較專案成對,判斷兩個序列是否相等。 由 Observable.) 定義的 (
公用擴充方法 SequenceEqual < TResult > (IObservable < TResult > , IEqualityComparer < TResult >) 多載。 使用指定的相等比較子,判斷兩個序列是否相等。 由 Observable.) 定義的 (
公用擴充方法 單一 < TResult > () 多載。 傳回可觀察序列的唯一元素,如果可觀察序列中沒有一個元素,則會擲回例外狀況。 由 Observable.) 定義的 (
公用擴充方法 單一 < TResult > (Func < TResult,布林 > 值) 多載。 傳回符合述詞之可觀察序列的唯一元素,如果可觀察序列中沒有一個元素,則會擲回例外狀況。 由 Observable.) 定義的 (
公用擴充方法 SingleOrDefault < TResult > () 多載。 傳回可觀察序列的唯一專案,如果可觀察序列是空的,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 SingleOrDefault < TResult (Func < TResult > , Boolean >) 多載。 傳回符合述詞之可觀察序列的唯一專案,如果沒有找到任何值,則傳回預設值。 由 Observable.) 定義的 (
公用擴充方法 略過 < TResult> 略過可觀察序列中的指定值數目,然後傳回其餘的值。 由 Observable.) 定義的 (
公用擴充方法 SkipLast < TResult> 略過可觀察序列結尾的指定專案數目。 由 Observable.) 定義的 (
公用擴充方法 SkipUntil < TResult、TOther> 只有在其他可觀察序列產生值之後,才會從來源可觀察序列傳回值。 由 Observable.) 定義的 (
公用擴充方法 SkipWhile < TResult (Func < TResult > 、Boolean >) 多載。 只要指定的條件為 true,就會略過可觀察序列中的值,然後傳回其餘的值。 由 Observable.) 定義的 (
公用擴充方法 SkipWhile < TResult (Func < TResult > , Int32, Boolean >) 多載。 只要指定的條件為 true,就會略過可觀察序列中的值,然後傳回其餘的值。 由 Observable.) 定義的 (
公用擴充方法 StartWith < TResult > TResult[]) 多載。 在具有指定來源和值的可觀察序列前面加上值序列。 由 Observable.) 定義的 (
公用擴充方法 StartWith < TResult > (IScheduler, TResult[]) 多載。 在具有指定來源、排程器和值的可觀察序列前面加上值序列。 由 Observable.) 定義的 (
公用擴充方法 訂閱 < TResult > () 多載。 使用指定的來源評估可觀察的序列。 由 ObservableExtensions.) 定義的 (
公用擴充方法 訂閱 < TResult > (動作 < TResult >) 多載。 訂閱可觀察序列的專案處理常式。 由 ObservableExtensions.) 定義的 (
公用擴充方法 訂閱 < TResult (動作 < TResult >> 、動作 < 例外 > 狀況) 多載。 將專案處理常式和例外狀況處理常式訂閱至可觀察的序列。 由 ObservableExtensions.) 定義的 (
公用擴充方法 訂閱 < TResult > (動作 < TResult > ,動作) 多載。 訂閱可觀察序列的專案處理常式和完成處理常式。 由 ObservableExtensions.) 定義的 (
公用擴充方法 訂閱 < TResult (動作 < TResult >> 、動作例外 > 狀況、動作 <) 多載。 將專案處理常式、例外狀況處理常式和完成處理常式訂閱至可觀察的序列。 由 ObservableExtensions.) 定義的 (
公用擴充方法 SubscribeOn < TResult > (SynchronizationCoNtext) 多載。 以非同步方式訂閱和取消訂閱指定之同步處理內容上的觀察者。 由 Observable.) 定義的 (
公用擴充方法 SubscribeOn < TResult > (Control) 多載。 由 ControlObservable.) 定義的 (
公用擴充方法 SubscribeOn < TResult > (發送器) 多載。 由 DispatcherObservable.) 定義的 (
公用擴充方法 SubscribeOn < TResult > (DispatcherScheduler) 多載。 由 DispatcherObservable.) 定義的 (
公用擴充方法 SubscribeOn < TResult > (IScheduler) 多載。 在指定的排程器上以非同步方式訂閱和取消訂閱觀察者。 由 Observable.) 定義的 (
公用擴充方法 SubscribeOnDispatcher < TResult> 由 DispatcherObservable.) 定義的 (
公用擴充方法 同步 < 處理 TResult > () 多載。 同步可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 同步 < 處理 TResult > (物件) 多載。 同步可觀察的序列。 由 Observable.) 定義的 (
公用擴充方法 擷取 < TResult> 從可觀察序列的開頭傳回指定的連續值數目。 由 Observable.) 定義的 (
公用擴充方法 TakeLast < TResult> 從可觀察序列結尾傳回指定的連續專案數目。 由 Observable.) 定義的 (
公用擴充方法 TakeUntil < TResult,TOther> 傳回來源可觀察序列的值,直到其他可觀察序列產生值為止。 由 Observable.) 定義的 (
公用擴充方法 TakeWhile < TResult (Func < TResult > ,布林值 >) 多載。 只要指定的條件為 true,就會傳回可觀察序列中的值,然後略過其餘的值。 由 Observable.) 定義的 (
公用擴充方法 TakeWhile < TResult (Func < TResult > , Int32, Boolean >) 多載。 只要指定的條件為 true,就會傳回可觀察序列中的值,然後略過其餘的值。 由 Observable.) 定義的 (
公用擴充方法 然後 < TResult、TResult> 符合可觀察序列具有可用的值,並投影值。 由 Observable.) 定義的 (
公用擴充方法 <節流 TResult > (TimeSpan) 多載。 忽略可觀察序列中的值,這些值後面接著另一個值,然後才有指定的來源和 dueTime。 由 Observable.) 定義的 (
公用擴充方法 <節流 TResult > (TimeSpan、IScheduler) 多載。 忽略可觀察序列中的值,這些值後面接著另一個值,然後才有指定的來源、dueTime 和排程器。 由 Observable.) 定義的 (
公用擴充方法 TimeInterval < TResult > () 多載。 使用指定的來源,記錄可觀察序列中連續值之間的時間間隔。 由 Observable.) 定義的 (
公用擴充方法 TimeInterval < TResult > (IScheduler) 多載。 使用指定的來源和排程器,記錄可觀察序列中連續值之間的時間間隔。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (TimeSpan) 多載。 如果 dueTime 經過,則傳回可觀察的序列或 TimeoutException。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (DateTimeOffset) 多載。 如果 dueTime 經過,則傳回可觀察的序列或 TimeoutException。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (TimeSpan、IObservable < TResult >) 多載。 如果 dueTime 經過,則傳回來源可觀察序列或其他可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (DateTimeOffset、IObservable < TResult >) 多載。 如果 dueTime 經過,則傳回可觀察的序列或 TimeoutException。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (TimeSpan、IScheduler) 多載。 如果 dueTime 經過,則傳回可觀察的序列或 TimeoutException。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (DateTimeOffset、IScheduler) 多載。 如果 dueTime 經過,則傳回可觀察的序列或 TimeoutException。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (TimeSpan、IObservable < TResult > 、IScheduler) 多載。 如果 dueTime 經過,則傳回來源可觀察序列或其他可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Timeout < TResult > (DateTimeOffset、IObservable < TResult > 、IScheduler) 多載。 如果 dueTime 經過,則傳回來源可觀察序列或其他可觀察序列。 由 Observable.) 定義的 (
公用擴充方法 Timestamp < TResult > () 多載。 使用指定的來源,記錄可觀察序列中每個值的時間戳記。 由 Observable.) 定義的 (
公用擴充方法 Timestamp < TResult > (IScheduler) 多載。 使用指定的來源和排程器,記錄可觀察序列中每個值的時間戳記。 由 Observable.) 定義的 (
公用擴充方法 ToArray < TResult> 從可觀察的序列建立陣列。 由 Observable.) 定義的 (
公用擴充方法 ToDictionary < TResult、TKey > (Func < TResult、TKey >) 多載。 根據指定的索引鍵選取器函式,從可觀察序列建立字典。 由 Observable.) 定義的 (
公用擴充方法 ToDictionary < TResult、TKey > (Func < TResult、TKey、IEqualityComparer < TKey >>) 多載。 根據指定的索引鍵選取器函式和比較子,從可觀察序列建立字典。 由 Observable.) 定義的 (
公用擴充方法 ToDictionary < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement >) 多載。 根據指定的索引鍵選取器函式和專案選取器函式,從可觀察序列建立字典。 由 Observable.) 定義的 (
公用擴充方法 ToDictionary < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement > 、IEqualityComparer < TKey >) 多載。 根據指定的索引鍵選取器函式、比較子和元素選取器函式,從可觀察序列建立字典。 由 Observable.) 定義的 (
公用擴充方法 ToEnumerable < TResult> 將可觀察序列轉換為可列舉序列。 由 Observable.) 定義的 (
公用擴充方法 ToEvent < TResult> 將可觀察序列公開為具有指定來源之 .NET 事件的物件。 由 Observable.) 定義的 (
公用擴充方法 ToList < TResult> 從可觀察的序列建立清單。 由 Observable.) 定義的 (
公用擴充方法 ToLookup < TResult、TKey > (Func < TResult、TKey >) 多載。 根據指定的索引鍵選取器函式,從可觀察序列建立查閱。 由 Observable.) 定義的 (
公用擴充方法 ToLookup < TResult、TKey > (Func < TResult、TKey、IEqualityComparer < TKey >>) 多載。 根據指定的索引鍵選取器函式和比較子,從可觀察序列建立查閱。 由 Observable.) 定義的 (
公用擴充方法 ToLookup < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement >) 多載。 根據指定的索引鍵選取器函式和元素選取器函式,從可觀察序列建立查閱。 由 Observable.) 定義的 (
公用擴充方法 ToLookup < TResult、TKey、TElement > (Func < TResult、TKey > 、Func < TResult、TElement > 、IEqualityComparer < TKey >) 多載。 根據指定的索引鍵選取器函式、比較子和專案選取器函式,從可觀察序列建立查閱。 由 Observable.) 定義的 (
公用擴充方法 ToNotifier < TSource> 從觀察者建立通知回呼。 由 Observer.) 定義的 (
公用擴充方法 ToTask < TResult > () 多載。 傳回包含可觀察序列最後一個值的工作。 TaskObservableExtensions.) 所定義的 (
公用擴充方法 ToTask < TResult > (物件) 多載。 傳回包含可觀察序列最後一個值的工作。 TaskObservableExtensions.) 所定義的 (
公用擴充方法 ToTask < TResult > (CancellationToken) 多載。 傳回包含可觀察序列最後一個值的工作。 TaskObservableExtensions.) 所定義的 (
公用擴充方法 ToTask < TResult > (CancellationToken,物件) 多載。 傳回包含可觀察序列最後一個值的工作。 TaskObservableExtensions.) 所定義的 (
公用擴充方法 其中 < TResult > (Func < TResult、Boolean >) 多載。 根據述詞篩選可觀察序列的專案。 由 Observable.) 定義的 (
公用擴充方法 其中 < TResult > (Func < TResult, Int32, Boolean >) 多載。 藉由合併元素的索引,根據述詞篩選可觀察序列的專案。 由 Observable.) 定義的 (
公用擴充方法 Window < TResult > (Int32) 多載。 將可觀察序列的每個元素投影到連續的非重迭視窗,這些視窗會根據專案計數資訊產生。 由 Observable.) 定義的 (
公用擴充方法 Window < TResult > (TimeSpan) 多載。 將可觀察序列的每個元素投影到連續的非重迭視窗,這些視窗會根據計時資訊產生。 由 Observable.) 定義的 (
公用擴充方法 Window < TResult > (Int32, Int32) 多載。 將可觀察序列的每個元素投影成零個或多個根據專案計數資訊產生的視窗。 由 Observable.) 定義的 (
公用擴充方法 時間 < 範圍 TResult > (TimeSpan、IScheduler) 多載。 將可觀察序列的每個元素投影到連續的非重迭視窗,這些視窗會根據計時資訊產生。 由 Observable.) 定義的 (
公用擴充方法 時間 < 範圍 TResult > (TimeSpan、TimeSpan) 多載。 將可觀察序列的每個元素投影到以計時資訊為基礎的零個或多個視窗。 由 Observable.) 定義的 (
公用擴充方法 時間 < 範圍 TResult > (TimeSpan、Int32) 多載。 將可觀察序列的每個元素投影到完成的視窗中,當它已滿或經過指定的時間量時。 由 Observable.) 定義的 (
公用擴充方法 時間 < 範圍 TResult > (TimeSpan、TimeSpan、IScheduler) 多載。 將可觀察序列的每個元素投影到以計時資訊為基礎的零個或多個視窗。 由 Observable.) 定義的 (
公用擴充方法 Window < TResult > (TimeSpan、Int32、IScheduler) 多載。 將可觀察序列的每個元素投影到完成的視窗中,當它已滿或經過指定的時間量時。 由 Observable.) 定義的 (
公用擴充方法 視窗 < TResult、TWindowClosing > (Func < IObservable < TWindowClosing >>) 多載。 將可觀察序列的每個元素投影到連續的非重迭視窗。 由 Observable.) 定義的 (
公用擴充方法 Window < TResult、TWindowOpening、TWindowClosing > (IObservable < TWindowOpening > 、Func < TWindowOpening、IObservable < TWindowClosing >>) 多載。 將可觀察序列的每個元素投影成零個或多個視窗。 由 Observable.) 定義的 (
公用擴充方法 Zip < TResult、TSecond、TResult > (IObservable < TSecond、Func < TResult、TSecond > 、TResult >) 多載。 將兩個可觀察的序列合併成一個可觀察的序列,方法是以配對方式結合其元素。 由 Observable.) 定義的 (
公用擴充方法 Zip < TResult、TSecond、TResult > (IEnumerable < TSecond、Func < TResult、TSecond > 、TResult >) 多載。 使用選取器函式,將可觀察序列和可列舉序列合併成一個可觀察序列。 由 Observable.) 定義的 (

頂端

備註

這個主旨介面可讓您彈性地觀察某個類型的可觀察序列,同時發行另一種型別的可觀察序列。

範例

這個範例示範如何實作 ISubject < TSource,TResult > 會觀察某個類型的可觀察序列,同時發行另一種型別的可觀察序列。 本範例中的 AsciiConverterSubject 會藉由觀察 char 類型的序列併發布 int 的可觀察序列來示範實作。int 的已發佈可觀察序列是所觀察之每個 char 值的 ASCII 程式碼。

using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Reactive.Concurrency;
using System.Reactive.Disposables;
using System.Threading;

namespace Example
{
  class Program
  {
    static void Main()
    {
      //****************************************************************************************//
      //*** Create an observable sequence of char from console input until enter is pressed. ***//
      //****************************************************************************************//
      IObservable<char> keySequence = Observable.Create<char>(observer =>
      {
        bool bContinue = true;

        while (bContinue)
        {
          ConsoleKeyInfo keyInfo = Console.ReadKey(true);

          if (keyInfo.Key != ConsoleKey.Enter)
          {
            observer.OnNext(keyInfo.KeyChar);
          }
          else
          {
            observer.OnCompleted();
            bContinue = false;
          }
        }

        return (() => { });
      });


      //****************************************************************************************//
      //*** Create an AsciiConverterSubject which takes a source type of char and returns an ***//
      //*** observable sequence of int which is the ASCII code for source items of char.     ***//
      //****************************************************************************************//

      AsciiConverterSubject myConverterSubject = new AsciiConverterSubject();


      //****************************************************************************************//
      //*** Subscribe to the keySequence on the .NET threadpool so the main thread can       ***//
      //*** create subscriptions to the AsciiConverterSubject                                ***//
      //****************************************************************************************//

      IDisposable subscription = keySequence.SubscribeOn(Scheduler.ThreadPool).Subscribe(myConverterSubject);


      Console.WriteLine("\nEnter a sequence of keys to have the AsciiConverterSubject\nconvert the keys to their ASCII code values.\n"); 
      Console.WriteLine("Press ENTER to terminate the observable sequence...\n");


      //****************************************************************************************//
      //*** Subscribe to the AsciiConverterSubject and write the ASCII code values to the    ***//
      //*** console window.                                                                  ***//
      //***                                                                                  ***//
      //*** The main thread will wait on the completion of the keySequence. It completes     ***//
      //*** when ENTER is pressed.                                                           ***//
      //****************************************************************************************//

      EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
      myConverterSubject.Subscribe(c => Console.WriteLine("Ascii Char code {0} entered.",c), () => waitHandle.Set());
      waitHandle.WaitOne();


      //***************************************//
      //*** Explicitly releasing resources. ***//
      //***************************************//
      
      subscription.Dispose();
      myConverterSubject.Dispose();
    }
  }



  //***********************************************************************************************//
  //***                                                                                         ***//
  //*** The AsciiConverterSubject demonstrates an implementation of ISubject<TSource, TResult>. ***//
  //*** It is used to subscribe to an observable sequence of char. It publishes an observable   ***//
  //*** sequence of int which should be the ASCII code for each char value it observes.         ***//
  //***                                                                                         ***//
  //***********************************************************************************************//

  class AsciiConverterSubject : ISubject<char, int>, IDisposable
  {
    private List<IObserver<int>> observerList;
    private bool isDisposed;
    private bool isStopped;
    object gate = new object();
    Exception exception;

    public AsciiConverterSubject()
    {
      observerList = new List<IObserver<int>>();
    }

    public void OnCompleted()
    {
      //****************************************************************************************//
      //*** Make sure the OnCompleted operation is not preempted by another operation        ***//
      //*** which would break the expected behavior.  For example, don't allow an error from ***//
      //*** OnError preempt OnCompleted from anotther thread. Then OnCompleted would follow  ***//
      //*** an error.  That would be an incorrect behavior.                                  ***//
      //****************************************************************************************//

      lock (gate)
      {
        CheckDisposed();

        if (!isStopped)
        {
          foreach (IObserver<int> observer in observerList)
          {
            observer.OnCompleted();
          }

          observerList.Clear();
          isStopped = true;
        }
      }
    }

    public void OnError(Exception error)
    {
      if (error == null)
        throw new ArgumentException("Exception error should not be null.");

      //****************************************************************************************//
      //*** Make sure the OnError operation is not preempted by another operation which      ***//
      //*** would break the expected behavior.  For example, don't allow unsubscribe or an   ***//
      //*** OnCompleted operation to preempt OnError from another thread. This would result  ***//
      //*** in an error following completion.  That would be an incorrect behavior.          ***//
      //****************************************************************************************//

      lock (gate)
      {
        CheckDisposed();

        if (!isStopped)
        {
          exception = error;

          foreach (IObserver<int> observer in observerList)
          {
            observer.OnError(error);
          }

          observerList.Clear();
          isStopped = true;
        }
      }
    }

    public void OnNext(char value)
    {
      //****************************************************************************************//
      //*** Make sure the OnNext operation is not preempted by another operation which       ***//
      //*** would break the expected behavior.  For example, don't allow unsubscribe, errors ***//
      //*** or an OnCompleted operation to preempt OnNext from another thread. This would    ***//
      //*** have the result of items in a sequence following completion, errors, or          ***//
      //*** unsubscribe.  That would be an incorrect behavior.                               ***//
      //****************************************************************************************//

      lock (gate)
      {
        CheckDisposed();

        if (!isStopped)
        {
          foreach (IObserver<int> observer in observerList)
          {
            observer.OnNext(Convert.ToInt32(value));
          }
        }
      }
    }

    public IDisposable Subscribe(IObserver<int> observer)
    {
      if (observer == null)
        throw new ArgumentException("observer should not BehaviorSubject null.");

      //****************************************************************************************//
      //*** Make sure Subscribe occurs in sync with the other operations so we keep the      ***//
      //*** correct behavior depending on whether an error has occurred or the observable    ***//
      //*** sequence has completed.                                                          ***//
      //****************************************************************************************//

      lock (gate)
      {
        CheckDisposed();

        if (!isStopped)
        {
          observerList.Add(observer);
          return new Subscription(observer, this);
        }
        else if (exception != null)
        {
          observer.OnError(exception);
          return Disposable.Empty;
        }
        else
        {
          observer.OnCompleted();
          return Disposable.Empty;
        }
      }
    }

    private void Unsubscribe(IObserver<int> observer)
    {
      //****************************************************************************************//
      //*** Make sure Unsubscribe occurs in sync with the other operations so we keep the    ***//
      //*** correct behavior.                                                                ***//
      //****************************************************************************************//

      lock (gate)
      {
        observerList.Remove(observer);
      }
    }

    public void Dispose()
    {
      //****************************************************************************************//
      //*** Make sure Dispose occurs in sync with the other operations so we keep the        ***//
      //*** correct behavior. For example, Dispose shouldn't preempt the other operations    ***//
      //*** changing state variables after they have been checked.                           ***//
      //****************************************************************************************//

      lock (gate)
      {
        observerList.Clear();
        isStopped = true;
        isDisposed = true;
      }
    }

    private void CheckDisposed()
    {
      if (isDisposed)
        throw new ObjectDisposedException("Subject has been disposed.");
    }


    //************************************************************************************//
    //***                                                                              ***//
    //*** The Subscription class wraps each observer that creates a subscription. This ***//
    //*** is needed to expose an IDisposable interface through which a observer can    ***//
    //*** cancel the subscription.                                                     ***//
    //***                                                                              ***//
    //************************************************************************************//

    class Subscription : IDisposable
    {
      private AsciiConverterSubject subject;
      private IObserver<int> observer;

      public Subscription(IObserver<int> obs, AsciiConverterSubject sub)
      {
        subject = sub;
        observer = obs;
      }

      public void Dispose()
      {
        subject.Unsubscribe(observer);
      }
    }
  }
}

下列輸出是由範例程式碼所產生。

Enter a sequence of keys to have the AsciiConverterSubject
convert the keys to their ASCII code values.

Press ENTER to terminate the observable sequence...

Ascii Char code 59 entered.
Ascii Char code 108 entered.
Ascii Char code 115 entered.
Ascii Char code 100 entered.
Ascii Char code 107 entered.
Ascii Char code 102 entered.
Ascii Char code 59 entered.
Ascii Char code 108 entered.
Ascii Char code 115 entered.
Ascii Char code 100 entered.
Ascii Char code 107 entered.
Ascii Char code 102 entered.
Ascii Char code 59 entered.
Ascii Char code 108 entered.
Ascii Char code 115 entered.
Ascii Char code 107 entered.
Ascii Char code 100 entered.
Ascii Char code 59 entered.
Ascii Char code 102 entered.
Ascii Char code 108 entered.
Ascii Char code 115 entered.
Ascii Char code 107 entered.
Ascii Char code 100 entered.

另請參閱

參考

System.Reactive.Subjects 命名空間