C# 反应性初始值

C# 反应性初始值,c#,xamarin,mvvm,reactive-property,C#,Xamarin,Mvvm,Reactive Property,我正在尝试将初始值设置为公共反应属性ConnectionStatus public ViewModelConstructor() { ConnectionStatus = Observable .Interval(RefreshInterval) .Select(x => Observable.FromAsync(() => networkDiscovererService.CanDiscover

我正在尝试将初始值设置为
公共反应属性ConnectionStatus

public ViewModelConstructor()
{
    ConnectionStatus = Observable
                    .Interval(RefreshInterval)
                    .Select(x => Observable.FromAsync(() => networkDiscovererService.CanDiscoverAsync("192.168.1.1", RequestTimeout)))
                    .Concat()
                    .Select(isConnected => isConnected ? $"connected" : $"not connected")
                    .ToReactiveProperty();
}
即使我试图像这样实例化它

public ReactiveProperty<string> ConnectionStatus { get; } =
            new ReactiveProperty<string>("Checking connectivity...");
public ReactiveProperty ConnectionStatus{get;}=
新的反应属性(“检查连接…”);
在可观察对象返回某些东西之前,它仍然是空的


有什么想法吗?我正在使用它。

使用ReactiveProperty-ctor获取订阅(如behaviorSubject或Replay(1))的初始值:

    [Test]
    public void ShouldReturnAValuOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30);
        reactiveProperty.Subscribe(testableObserver);

        Assert.AreEqual(30, testableObserver.Messages.Single().Value.Value);
    }
[测试]
public void应返回AvaluOnSubscribe()
{
var testScheduler=newtestscheduler();
var testableObserver=testScheduler.CreateObserver();
var-reactiveProperty=新的reactiveProperty(30);
reactiveProperty.Subscribe(testableObserver);
AreEqual(30,testableObserver.Messages.Single().Value.Value);
}

要使用.ToReactiveProperty()获取订阅的初始值(如behaviorSubject或Replay(1)):

[测试]
public void应返回AvaluOnToreactiveProperty()
{
var testScheduler=newtestscheduler();
var testableObserver=testScheduler.CreateObserver();
var reactiveProperty=Observable.Never().ToReactiveProperty(40);
reactiveProperty.Subscribe(testableObserver);
AreEqual(40,testableObserver.Messages.Single().Value.Value);
}
不获取订阅的初始值-更改ReactivePropertyMode:

    [Test]
    public void ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30, ReactivePropertyMode.None);
        reactiveProperty.Subscribe(testableObserver);

        Assert.IsEmpty(testableObserver.Messages);
    }
[测试]
当Deisnou和OnSubscribe()被删除时,public void不应返回初始值
{
var testScheduler=newtestscheduler();
var testableObserver=testScheduler.CreateObserver();
var reactiveProperty=新的reactiveProperty(30,ReactivePropertyMode.None);
reactiveProperty.Subscribe(testableObserver);
Assert.IsEmpty(testableObserver.Messages);
}
基本上,您要查找的是初始值ReactivePropertyMode.RaiseRelatestValuesonSubscribe标志

在第一种情况下,您忘记使用初始值提供ToReactiveProperty()(例如,ToReactiveProperty(30))

在第二种情况下,它应该对您有效-模式设置为ReactivePropertyMode。默认情况下,RaiseRelatestValuesonSubscribe(选中ShouldReturnAValuOnSubscribe)。尝试显式设置模式(如在中,当Deisnone\u和Subscribe时不应返回初始值)

我使用了ReactiveProperty 3.6.0


顺便说一句,基于计时器测试连接不是一个好主意:)

谢谢你的提示。关于基于定时器的连接测试仪,您有什么建议吗?它用于网络上设备的实时流数据,因此如果设备不可用,我需要通知用户。嗨@GabrielRobert。我不知道networkDiscovererService类的内部结构,但通常这类类类都有类似于连接/断开连接的事件来报告状态。在这种情况下,基于计时器的连接应该是您的最后手段:)它只是一个针对IP的ping服务。我每隔几秒钟触发一次ping,以确保始终可以访问它。为了便于访问,用户需要使用同一设备的wifi。
    [Test]
    public void ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30, ReactivePropertyMode.None);
        reactiveProperty.Subscribe(testableObserver);

        Assert.IsEmpty(testableObserver.Messages);
    }