相关疑难解决方法(0)

Reactive Extensions超时不会停止序列?

我试图让一个IObservable<bool>返回true如果一个UDP消息在最后5秒,如果发生超时被接收,一个返回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));
}
Run Code Online (Sandbox Code Playgroud)

这个问题是: -

  • 一旦返回false,序列就会停止
  • 我只是真的需要truefalse改变状态.

我可以使用a Subject<T>但是UDPBaseStringListener当没有更多订阅者时我需要小心处理observable.

更新

每次我收到UDP消息,我都希望它返回一个true.如果我在最近5秒内没有收到UDP消息,我希望它返回一个false.

c# system.reactive

5
推荐指数
1
解决办法
2889
查看次数

Rx observable 会在特定超时到期时发布一个值

我有一个返回可观察对象的方法。这个 observable 应该(如果 evetything 正常工作)每秒发布一个值。我想要做的是让它发布一些自定义警报值,如果某个时间过去了而没有输出。

private IObservable<string> GetStatus()
{
    return statusProvider
                .Subscribe(statusKey)  //returns an IObservable<string>
                .Select(st => st.ToUpper())
                .DistinctUntilChanged()
                .TakeUntil(disposed)
                .Replay(1)
                .RefCount();
}
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法可以让我修改上述内容,以便如果 30 秒内没有状态更新,则 statusProvider 发布“坏”,然后如果更新确实在此之后进入,它会像往常一样发布并且计时器是再次重启到30秒?

c# system.reactive

5
推荐指数
1
解决办法
782
查看次数

如何使用 RX 实现超时序列?

场景如下:如果设备在短时间内回调到服务器,则认为设备已连接。我想创建一个类来封装跟踪此状态的功能。调用设备时,应重置超时。回调时,连接被确认,状态应设置为true,如果回调超时,则应设置为false。但是下次调用应该可以重新设置超时时间,不管当前状态如何。

我想通过 RX 使用swith和来实现这一点timeout。但我不知道为什么它停止工作。

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);
}
}
Run Code Online (Sandbox Code Playgroud)

这是“测试用例”:

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

c.SetPending(); …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive .net-4.6

4
推荐指数
1
解决办法
846
查看次数

标签 统计

c# ×3

system.reactive ×3

.net-4.6 ×1