观察与RX的WCF服务呼叫
作者:互联网
我有一个WCF心跳服务,该服务接受来自客户端的活动.如果保持活动未在指定的时间内到达,则会引发超时并采取某些措施.现在,我正在尝试简化使用System.Threading.Timer的现有代码,并将其替换为基于RX的解决方案.我所缺少的是如何将WCF服务方法类转换为可观察的.我考虑的是以下内容:
>在WCF服务中实现IObservable,并以订阅者参数的形式传递缓存观察器,这可能不是一个好主意,并且代码难看
>这样使用主题:
Subject s1 = new Subject();
s1.Timeout(TimeSpan.FromSeconds(3))
.Subscribe(_ => { }, ex => Console.WriteLine("Timeout at " + DateTime.Now));
Console.WriteLine("Hertbeat at: " + DateTime.Now);
s1.OnNext(Unit.Default);
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("Hertbeat at: " + DateTime.Now);
s1.OnNext(Unit.Default);
这可行,但是在生产代码中使用主题不是一个好主意.
>在服务的实现中使用事件:
class HeartbeatService
{
public void Heartbeat()
{
OnHeartbeatArrived();
}
public event Action HeartbeatArrived;
protected virtual void OnHeartbeatArrived()
{
Action handler = HeartbeatArrived;
if (handler != null) handler(Unit.Default);
}
}
然后使用RX
HeartbeatService heartbeatService = new HeartbeatService();
Observable.FromEvent<Unit>(action => heartbeatService.HeartbeatArrived += action,
action => heartbeatService.HeartbeatArrived -= action)
.Timeout(TimeSpan.FromSeconds(3))
.Subscribe(_ => { },
ex => Console.WriteLine("Timeout " + ex + ", at " + DateTime.Now));
Console.WriteLine("Heartbeat at: " + DateTime.Now);
heartbeatService.Heartbeat();
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("Heartbeat at: " + DateTime.Now);
heartbeatService.Heartbeat();
Console.WriteLine("Should timeout now");
我也不喜欢这种解决方案,WCF服务中的事件似乎是多余的.
有没有在RX中执行此操作的好方法,或者我试图在此处滥用RX?
解决方法:
Throttle运算符是Rx中心跳算法的关键部分.基本思想是建立一个包含警报的流,只要心跳到达,该警报就会被抑制.有关更多详细信息,请参见我的博客文章:http://www.zerobugbuild.com/?p=230
标签:system-reactive,wcf,c 来源: https://codeday.me/bug/20191122/2059701.html