其他分享
首页 > 其他分享> > 观察与RX的WCF服务呼叫

观察与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