IObservableをスロットリングすると、オブザーバーが呼び出されなくなります

mnn

私はこの単純なコードを持っています、それは:

  • IObservableを作成します
  • 0.5秒間サンプリングします
  • ThreadPoolスケジューラーを使用してサブスクライブします
  • 彼らはSynchronizationContextを使用してそれを観察します

コードは次のとおりです。

private void DisplayPoints()
{
    var x = 0;
    var ob = this.GeneratePoints();
    ob
      .Sample(TimeSpan.FromMilliseconds(500))
      .SubscribeOn(ThreadPoolScheduler.Instance)
      .ObserveOn(SynchronizationContext.Current)
      .Subscribe(d => Console.WriteLine(d));
}

private IObservable<double> GeneratePoints()
{
    return Observable.Create<double>(o => this.GeneratePoints(o));
}

private IDisposable GeneratePoints(IObserver<double> observer)
{
    var i = 0;
    while (true)
    {
        var value = random.Next(0, 100) * (1 / (double)random.Next(1, Math.Min(50, Math.Max(i, 1))));

        observer.OnNext(value);

        i++;
    }

    return Disposable.Empty;
}

ただし、コンソールには何も出力されません(つまり、匿名のオブザーバーが呼び出されることはありません)。Sampleオペレーターを削除すると、オブザーバーが呼び出されますが、その動作は明らかに意図されていません(UIスレッドが攻撃されます)。

私は明らかにここで何かが欠けています。私の意図は、データを生成し、IObserverを介してプッシュし、UIを介してその一部を表示することです。

編集:何人かの人々が私の意図を誤解しているので(彼らは上で明確に述べられていますが)、私がやろうとしていることを繰り返します:

  • アルゴリズムを使用していくつかのデータを生成します(double私の問題には値で十分だと思われます)
  • GUIでデータを表示する

IObservableReactive Extensionsの使用は、私の問題に対する良い解決策のように思えました。

ただ、繰り返しに:私は乱数を返しません-これはちょうどだった実際のコードにプレースホルダー私の意図した動作の作業を取得します。

ブラッドゴーンサーフィン

タイトなループで乱数を生成したくない場合があります。時間間隔を使用することをお勧めします。以下は、200ミリ秒ごとに乱数を生成します。

IObservable<double> observable =
     Observable.Interval(TimeSpan.FromMillSeconds(200))
          .Select((t,i) => random.Next(0, 100) 
                      * (1 / (double)random.Next(1, Math.Min(50, Math.Max(i, 1)))))

Enigmativityが作成したコードも、事実上タイトループです。サブスクライブプロセスで値をプッシュする際のエラーについて彼が指摘した点も正しいです。コードを機能させるために必要な最小限の変更は次のとおりです。

    private static Task GeneratePoints(IObserver<double> observer, CancellationToken token)
    {
        return Task.Run(() =>
        {
            var i = 0;
            var random = new Random();
            while ( true )
            {
                token.ThrowIfCancellationRequested();

                var value = random.Next(0, 100) * ( 1 / ( double ) random.Next(1, Math.Min(50, Math.Max(i, 1))) );

                observer.OnNext(value);

                i++;
            }
        });
    }

今度いつか

    Observable.Create<double>((observer, token) => GeneratePoints(observer, token));

キャンセルトークンが渡されていることに注意してください。シーケンスのサブスクライバーがサブスクライブを解除すると、このトークンが設定され、ループが終了します。

ただし、これは多くの作業であり、Enigmativitiesの回答はより単純であり、上記のコードを抽象化します。より複雑なケースでは、これを手動で行う方法を知っておくと便利です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

オプション内でネストされたタグを選択すると、メソッドが呼び出されなくなります

分類Dev

コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

分類Dev

プロパティを初期化するときにdidSetオブザーバーが呼び出されない

分類Dev

Magentoカートの編集ボタンをクリックすると、どのオブザーバーが呼び出されますか?

分類Dev

Akka Streams:onPull(_、_)内ではなくpush(_、_)を呼び出すと、ストリームがブロックされます-なぜですか?

分類Dev

アクティビティが破棄されてから再作成されると、オブザーバーが呼び出されず、ポストバリューがバックグラウンドスレッドから機能しない

分類Dev

フラグメントに戻るたびにlivedataオブザーバーが呼び出されます

分類Dev

フラグメントに戻ると、オブザーバーはすぐに呼び出されます

分類Dev

有効なメソッドオーバーロードを呼び出そうとすると、奇妙な「アセンブリが参照されていません」エラーが発生します

分類Dev

iMessage拡張機能:ルートナビゲーションコントローラーを使用すると、すべてのデリゲートメソッドがMSMessagesAppViewControllerで呼び出されなくなります

分類Dev

Django Adminでchange_form.htmlテンプレートをオーバーライドすると、モデルリストビューのブレッドクラムがグレー表示され、クリックできなくなります

分類Dev

アプリがアクティブになると常に呼び出されるヘルスキットオブザーバークエリ

分類Dev

ソースオブジェクトとして使用されるフォームで宣言されたパブリックサブルーチンを、メインフォームからサブフォームコントロールを呼び出すのに最適な方法はありますか?

分類Dev

モデルクエリのクローンを作成すると、Yii2でMySQLクエリが呼び出されなくなりますか?

分類Dev

バックワードが呼び出されたときに nn.CDivTable がエラーをスローする正当な理由はありますか?

分類Dev

データストア:失敗したトランザクションとロールバック:ロールバックが呼び出されないか失敗した場合はどうなりますか?

分類Dev

AVMutableVideoComposition命令を設定すると、ハンドラーが呼び出されなくなります

分類Dev

RxJsマップ関数により、アップストリームオブザーバブルが複数回呼び出されます

分類Dev

コントローラからモデルメソッドを呼び出す「非オブジェクトのメンバー関数を呼び出す...」が、ビューから呼び出されると機能します

分類Dev

スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

分類Dev

スタックをオーバーフローさせることなく、非同期関数を再帰的に呼び出すことはできますか?

分類Dev

関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

分類Dev

なぜpdbをインポートするのですか。pdb.set_traceは、Spyderで異なる方法で呼び出されたときに、2つの異なるデバッグシナリオをトリガーしますか?

分類Dev

AS3リスナーが呼び出されると、コードフローはどうなりますか?

分類Dev

Eclipse Tomcatサーバーでhttpsを有効にすると、ポート8080への呼び出しが許可されなくなります

分類Dev

呼び出されたスクリプトが閉じたときに開いたままになっているブラウザウィンドウについて、Pythonデータを呼び出し元のスクリプトに戻す方法

分類Dev

オブザーバーメソッドが2回呼び出されるのはなぜですか?

分類Dev

オブザーバブルが設定されているときにノックアウトがサブスクライブを呼び出さないようにする

分類Dev

オブジェクト内のすべてのメンバーに対してsetTimeout()を呼び出す-1番目のメンバーに対して呼び出されることはなく、2番目のメンバーに対して呼び出されます。どうして?

Related 関連記事

  1. 1

    オプション内でネストされたタグを選択すると、メソッドが呼び出されなくなります

  2. 2

    コンストラクターまたはinitブロックから呼び出されたオーバーライドされた抽象関数で変数を初期化するときに変数が正しく初期化されない

  3. 3

    プロパティを初期化するときにdidSetオブザーバーが呼び出されない

  4. 4

    Magentoカートの編集ボタンをクリックすると、どのオブザーバーが呼び出されますか?

  5. 5

    Akka Streams:onPull(_、_)内ではなくpush(_、_)を呼び出すと、ストリームがブロックされます-なぜですか?

  6. 6

    アクティビティが破棄されてから再作成されると、オブザーバーが呼び出されず、ポストバリューがバックグラウンドスレッドから機能しない

  7. 7

    フラグメントに戻るたびにlivedataオブザーバーが呼び出されます

  8. 8

    フラグメントに戻ると、オブザーバーはすぐに呼び出されます

  9. 9

    有効なメソッドオーバーロードを呼び出そうとすると、奇妙な「アセンブリが参照されていません」エラーが発生します

  10. 10

    iMessage拡張機能:ルートナビゲーションコントローラーを使用すると、すべてのデリゲートメソッドがMSMessagesAppViewControllerで呼び出されなくなります

  11. 11

    Django Adminでchange_form.htmlテンプレートをオーバーライドすると、モデルリストビューのブレッドクラムがグレー表示され、クリックできなくなります

  12. 12

    アプリがアクティブになると常に呼び出されるヘルスキットオブザーバークエリ

  13. 13

    ソースオブジェクトとして使用されるフォームで宣言されたパブリックサブルーチンを、メインフォームからサブフォームコントロールを呼び出すのに最適な方法はありますか?

  14. 14

    モデルクエリのクローンを作成すると、Yii2でMySQLクエリが呼び出されなくなりますか?

  15. 15

    バックワードが呼び出されたときに nn.CDivTable がエラーをスローする正当な理由はありますか?

  16. 16

    データストア:失敗したトランザクションとロールバック:ロールバックが呼び出されないか失敗した場合はどうなりますか?

  17. 17

    AVMutableVideoComposition命令を設定すると、ハンドラーが呼び出されなくなります

  18. 18

    RxJsマップ関数により、アップストリームオブザーバブルが複数回呼び出されます

  19. 19

    コントローラからモデルメソッドを呼び出す「非オブジェクトのメンバー関数を呼び出す...」が、ビューから呼び出されると機能します

  20. 20

    スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

  21. 21

    スタックをオーバーフローさせることなく、非同期関数を再帰的に呼び出すことはできますか?

  22. 22

    関数の戻り値でオブジェクトを初期化するときにコピーコンストラクターが呼び出されない

  23. 23

    なぜpdbをインポートするのですか。pdb.set_traceは、Spyderで異なる方法で呼び出されたときに、2つの異なるデバッグシナリオをトリガーしますか?

  24. 24

    AS3リスナーが呼び出されると、コードフローはどうなりますか?

  25. 25

    Eclipse Tomcatサーバーでhttpsを有効にすると、ポート8080への呼び出しが許可されなくなります

  26. 26

    呼び出されたスクリプトが閉じたときに開いたままになっているブラウザウィンドウについて、Pythonデータを呼び出し元のスクリプトに戻す方法

  27. 27

    オブザーバーメソッドが2回呼び出されるのはなぜですか?

  28. 28

    オブザーバブルが設定されているときにノックアウトがサブスクライブを呼び出さないようにする

  29. 29

    オブジェクト内のすべてのメンバーに対してsetTimeout()を呼び出す-1番目のメンバーに対して呼び出されることはなく、2番目のメンバーに対して呼び出されます。どうして?

ホットタグ

アーカイブ