RXで一連のタイムアウトを実現するにはどうすればよいですか?

ZorgoZ

シナリオは次のとおりです。通信しているデバイスは、短期間でサーバーにコールバックした場合、接続されていると見なされます。このステータスを追跡する機能をカプセル化するクラスを作成したいと思います。デバイスへの呼び出し時に、タイムアウトをリセットする必要があります。コールバック時に接続が確認され、ステータスをtrue設定する必要があります。コールバックがタイムアウトした場合は、falseに設定する必要がありますただし、次の呼び出しでは、現在のステータスに関係なく、タイムアウトを再度リセットできるはずです。

私は、RXは、使用してこれを達成するために考えていたswithtimeoutしかし、なぜそれが機能しなくなるのかわかりません。

public class ConnectionStatus
{
private Subject<bool> pending = new Subject<bool>();
private Subject<bool> connected = new Subject<bool>();

public bool IsConnected { get; private set; }

public ConnectionStatus(CancellationToken token, short timeoutSeconds = 15)
{
    pending.Select(outer => connected.Timeout(TimeSpan.FromSeconds(timeoutSeconds))) 
        .Switch()
        .Subscribe(_ => IsConnected = true, e => IsConnected = false, token);
}

public void ConfirmConnected()
{
    connected.OnNext(true);
}

public void SetPending()
{
    pending.OnNext(true);
}
}

これは「テストケース」です。

var c = new ConnectionStatus(default(CancellationToken));

c.SetPending();
await Task.Delay(TimeSpan.FromSeconds(5));
c.ConfirmConnected();   
c.IsConnected.Dump(); // TRUE, OK

c.SetPending();
await Task.Delay(TimeSpan.FromSeconds(5));
c.ConfirmConnected();
c.IsConnected.Dump(); // TRUE, OK

c.SetPending();
await Task.Delay(TimeSpan.FromSeconds(20));
c.IsConnected.Dump(); // FALSE, OK
c.ConfirmConnected(); 
c.IsConnected.Dump(); // FALSE, OK

c.SetPending();
await Task.Delay(TimeSpan.FromSeconds(10));
c.ConfirmConnected(); 
c.IsConnected.Dump(); // FALSE, NOT OK!

内側のオブザーバブルのタイムアウトによって、外側のオブザーバブルも停止していると思います。outer =>ラムダもはや呼び出されません。正しい方法は何ですか?

ありがとうございました

シュロモ

問題は、Timeout本質的にRxサブスクリプションを爆破する例外を引き起こすことです。タイムアウトがトリガーされた後(コーディングしたとおり)、他の通知は送信されません。Rx文法では、*OnNextメッセージの後に1つOnCompletedまたは1つのメッセージを続けることができますOnErrorOnErrorからがTimeout送信され、あなたはこれ以上のメッセージが表示されます。

OnNextメッセージではなくメッセージを介してタイムアウトメッセージを配信する必要がありOnErrorます。古いコードでは、anyOnErrorをfalseに、anyOnNextをtrueに変換しました。代わりに、適切な新しいIsConnected値をOnNextメッセージに埋め込む必要があります。その方法は次のとおりです。

public ConnectionStatus(CancellationToken token, short timeoutSeconds = 15)
{
    pending.Select(_ => connected
            .Timeout(TimeSpan.FromSeconds(timeoutSeconds))
            .Materialize()
            .Select(n => n.Kind == NotificationKind.OnError && n.Exception.GetType() == typeof(TimeoutException) 
                ? Notification.CreateOnNext(false)
                : n)
            .Dematerialize()
            .Take(1)
        )
        .Switch()
        .Subscribe(b => IsConnected = b, token);
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

タイムアウト付きのRunnableを実装するにはどうすればよいですか?

分類Dev

本のようなレイアウトを実現するにはどうすればよいですか?

分類Dev

CSSとdivでこのレイアウトを実現するにはどうすればよいですか?

分類Dev

このレイアウトを適切に実現するにはどうすればよいですか?

分類Dev

特定のレイアウトを実現するにはどうすればよいですか

分類Dev

次のレイアウトを実現するにはどうすればよいですか?

分類Dev

このCSSレイアウトを実現するにはどうすればよいですか?

分類Dev

テスト実行タイムアウトを変更するにはどうすればよいですか?

分類Dev

タイムアウト機能を実装するにはどうすればよいですか?

分類Dev

AngularでHttpHandlerのタイムアウトを設定するにはどうすればよいですか?

分類Dev

ストーリーボードのボタンでこのレイアウトを実現するにはどうすればよいですか?

分類Dev

TestSchedulerを使用してタイムアウト動作を実現するにはどうすればよいですか?

分類Dev

dask:タスクのタイムアウトを回避するにはどうすればよいですか?

分類Dev

次のレイアウトを実現するために自動レイアウトを使用するにはどうすればよいですか?

分類Dev

春のDriverManagerDataSourceにタイムアウトを設定するにはどうすればよいですか

分類Dev

この日付のタイムアウトを削除するにはどうすればよいですか?

分類Dev

現在適用されている残りのsudoタイムアウトをキャンセルするにはどうすればよいですか?

分類Dev

現在適用されている残りのsudoタイムアウトをキャンセルするにはどうすればよいですか?

分類Dev

制約レイアウトで動的幅を使用して次のレイアウトを実現するにはどうすればよいですか?

分類Dev

TcpClientのタイムアウトを設定するにはどうすればよいですか?

分類Dev

SQLQueryのタイムアウトを設定するにはどうすればよいですか?

分類Dev

OkHttpClientのタイムアウトを設定するにはどうすればよいですか?

分類Dev

SqlTransaction.Save()のタイムアウトを設定するにはどうすればよいですか?

分類Dev

Net :: HTTP.startのタイムアウトを設定するにはどうすればよいですか?

分類Dev

すべてのタイムアウトが実行された後、配列サイズを取得するにはどうすればよいですか?

分類Dev

Puppeteerを実行しているJestテストの最大タイムアウトを設定するにはどうすればよいですか?

分類Dev

Androidで現在のレイアウトを取得するにはどうすればよいですか?

分類Dev

スクリプトの「内部」でタイムアウトを実行するにはどうすればよいですか?

分類Dev

JavaFxでタスクタイムアウトを設定するにはどうすればよいですか?

Related 関連記事

  1. 1

    タイムアウト付きのRunnableを実装するにはどうすればよいですか?

  2. 2

    本のようなレイアウトを実現するにはどうすればよいですか?

  3. 3

    CSSとdivでこのレイアウトを実現するにはどうすればよいですか?

  4. 4

    このレイアウトを適切に実現するにはどうすればよいですか?

  5. 5

    特定のレイアウトを実現するにはどうすればよいですか

  6. 6

    次のレイアウトを実現するにはどうすればよいですか?

  7. 7

    このCSSレイアウトを実現するにはどうすればよいですか?

  8. 8

    テスト実行タイムアウトを変更するにはどうすればよいですか?

  9. 9

    タイムアウト機能を実装するにはどうすればよいですか?

  10. 10

    AngularでHttpHandlerのタイムアウトを設定するにはどうすればよいですか?

  11. 11

    ストーリーボードのボタンでこのレイアウトを実現するにはどうすればよいですか?

  12. 12

    TestSchedulerを使用してタイムアウト動作を実現するにはどうすればよいですか?

  13. 13

    dask:タスクのタイムアウトを回避するにはどうすればよいですか?

  14. 14

    次のレイアウトを実現するために自動レイアウトを使用するにはどうすればよいですか?

  15. 15

    春のDriverManagerDataSourceにタイムアウトを設定するにはどうすればよいですか

  16. 16

    この日付のタイムアウトを削除するにはどうすればよいですか?

  17. 17

    現在適用されている残りのsudoタイムアウトをキャンセルするにはどうすればよいですか?

  18. 18

    現在適用されている残りのsudoタイムアウトをキャンセルするにはどうすればよいですか?

  19. 19

    制約レイアウトで動的幅を使用して次のレイアウトを実現するにはどうすればよいですか?

  20. 20

    TcpClientのタイムアウトを設定するにはどうすればよいですか?

  21. 21

    SQLQueryのタイムアウトを設定するにはどうすればよいですか?

  22. 22

    OkHttpClientのタイムアウトを設定するにはどうすればよいですか?

  23. 23

    SqlTransaction.Save()のタイムアウトを設定するにはどうすればよいですか?

  24. 24

    Net :: HTTP.startのタイムアウトを設定するにはどうすればよいですか?

  25. 25

    すべてのタイムアウトが実行された後、配列サイズを取得するにはどうすればよいですか?

  26. 26

    Puppeteerを実行しているJestテストの最大タイムアウトを設定するにはどうすればよいですか?

  27. 27

    Androidで現在のレイアウトを取得するにはどうすればよいですか?

  28. 28

    スクリプトの「内部」でタイムアウトを実行するにはどうすればよいですか?

  29. 29

    JavaFxでタスクタイムアウトを設定するにはどうすればよいですか?

ホットタグ

アーカイブ