c# - 不停止序列的 react 性扩展超时?

标签 c# system.reactive

我正在尝试制作一个 IObservable<bool>返回 true如果在最后 5 秒内接收到 UDP 消息并且发生超时,则返回 false。

到目前为止我有这个:

public IObservable<Boolean> GettingUDPMessages(IPEndPoint localEP)
{
    var udp = BaseComms.UDPBaseStringListener(localEP)
        .Where(msg => msg.Data.Contains("running"))
        .Select(s => true);

    return Observable
        .Timeout(udp, TimeSpan.FromSeconds(5))
        .Catch(Observable.Return(false));
}

问题是:-

  • 一旦返回 false,序列停止
  • 我真的只需要 truefalse关于状态变化。

我可以使用 Subject<T>但我需要小心处理 UDPBaseStringListener当没有更多订阅者时可以观察到。

更新

每次收到 UDP 消息时,我都希望它返回 true .如果我在过去 5 秒内没有收到 UDP 消息,我希望它返回 false .

最佳答案

正如 Bj0 指出的那样,带有 BufferWithTime 的解决方案不会在接收到数据点后立即返回数据点,并且在接收到数据点后不会重置缓冲区超时。

使用 Rx Extensions 2.0,您可以通过接受超时和大小的新 Buffer 重载来解决这两个问题:

static IObservable<Boolean> GettingUDPMessages(IPEndPoint localEP)
{
    return BaseComms
        .UDPBaseStringListener(localEP)
        .Where(msg => msg.Data.Contains("running"))
        .Buffer(TimeSpan.FromSeconds(5), 1)
        .Select(s => s.Count > 0)
        .DistinctUntilChanged();
}

关于c# - 不停止序列的 react 性扩展超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8064104/

相关文章:

c# - 使用 WPF、MVVM 和 DP 的用户控制

c# - 将 Access 数据导入 SQL Server CE(.mdb 到 .sdf)

c# - Rx 将 subject 的使用转换为 Observable.Create 方法

c# - 将方法调用变成可观察事件,好主意吗?

c# - 具有 Observable 的复杂流程

c# - 如何使 IObservable<T> 的实现成为多线程的?

c# - 从 C# 以 32 位或 64 位运行 PowerShell

c# - Entity-framework-7 将 Fluent API 配置组织到一个单独的类中

c# - VLC 命令行 - 转码

silverlight - ReactiveUI:将 CanExecute 与 ReactiveCommand 结合使用