Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rx的连接状态和错误元数据最佳实践 系统_C#_.net_Design Patterns_Signalr_System.reactive - Fatal编程技术网

C# Rx的连接状态和错误元数据最佳实践 系统

C# Rx的连接状态和错误元数据最佳实践 系统,c#,.net,design-patterns,signalr,system.reactive,C#,.net,Design Patterns,Signalr,System.reactive,我正在为一家金融服务公司构建一个服务器端流式计算引擎,对滴答作响的市场数据进行实时计算 其思想是,计算服务器获得与各种市场数据源(主要是彭博社)的连接,并在新输入(价格、汇率等)到达时重新计算各种相对复杂的计算 然后,这些计算结果将被推送到使用SignalR连接到服务器的各种客户端(WPF桌面)。在客户端和服务器上,我将使用Rx和IObservable实现一个管道,用于计算和级联来自它们的下游活动 问题 问题是,计算的有效状态可能是0.3995,但可能是“等待价格”,甚至是“服务器停机” 我不想

我正在为一家金融服务公司构建一个服务器端流式计算引擎,对滴答作响的市场数据进行实时计算

其思想是,计算服务器获得与各种市场数据源(主要是彭博社)的连接,并在新输入(价格、汇率等)到达时重新计算各种相对复杂的计算

然后,这些计算结果将被推送到使用SignalR连接到服务器的各种客户端(WPF桌面)。在客户端和服务器上,我将使用Rx和IObservable实现一个管道,用于计算和级联来自它们的下游活动

问题 问题是,计算的有效状态可能是0.3995,但可能是“等待价格”,甚至是“服务器停机”

我不想使用内置的Rx错误系统,因为它看起来很脆弱。一旦遇到任何异常,IObservable将永远终止,必须重新订阅才能恢复。我希望我的流是健壮的和持久的,并且预期可能的可恢复错误状态是数据片段,而不是异常

我现在的想法 我正在尝试将流中的返回数据包装成一种monad,类似这样:

有人有更好的建议吗?或者一些可以帮助我正确分析问题的指针?

    public enum TransientState 
    {
        NotReady = 0,
        Ok = 1,
        Faulted = 2,
        Fatal = 3
    }

    public struct RxMessage<T> 
    {
        public TransientState State { get; set; }
        public DateTime TimestampUtc { get; set; }
        public string Fault { get; set; }
        public T Payload { get; set; }
    }
公共枚举瞬态状态
{
NotReady=0,
Ok=1,
故障=2,
致命=3
}
公共结构RxMessage
{
公共瞬态状态{get;set;}
public DateTime TimestampUtc{get;set;}
公共字符串错误{get;set;}
公共T有效载荷{get;set;}
}

您的方法是有道理的,而且肯定会奏效

我可能更喜欢单独的状态流。使用单独的流,您不会继续推送相同的状态数据,客户端可以单独处理新数据和状态更改

例如:

var statusStream = new Subject<TransientState>();
var tickStream = new Subject<float>();

var finalStream = statusStream
    .Select(s => s == TransientState.Ok ? tickStream : Observable.Never<float>() )
    .Switch();

finalStream.Dump(); //linqpad

statusStream.OnNext(TransientState.NotReady);
tickStream.OnNext(0);
statusStream.OnNext(TransientState.Ok);
tickStream.OnNext(1);
tickStream.OnNext(2);
tickStream.OnNext(3);
statusStream.OnNext(TransientState.Faulted);
tickStream.OnNext(4);
tickStream.OnNext(5);
statusStream.OnNext(TransientState.Ok);
tickStream.OnNext(6);
var statusStream=新主题();
var tickStream=新主题();
var finalStream=statusStream
.Select(s=>s==TransientState.Ok?tickStream:Observable.Never())
.开关();
finalStream.Dump()//林帕德
statusStream.OnNext(TransientState.NotReady);
tickStream.OnNext(0);
statusStream.OnNext(TransientState.Ok);
tickStream.OnNext(1);
tickStream.OnNext(2);
tickStream.OnNext(3);
statusStream.OnNext(TransientState.Faulted);
tickStream.OnNext(4);
tickStream.OnNext(5);
statusStream.OnNext(TransientState.Ok);
tickStream.OnNext(6);

输出是
1 2 3 6
,只有状态正常时才显示的数字。

我以前使用RX构建过这样的系统,我处理异常的方法是将它们包装成Polly,允许在应用程序生产时灵活配置。据我记忆所及,这种方法产生了一个稳定的系统。假设网络连接失败,我必须验证连接断开时的数据。很好,谢谢。我以前没见过波莉,谢谢。这肯定是我没有考虑过的。