using System.Reactive.Subjects;
using System.Reactive.Linq;
using System.Collections.Generic;
static Subject<UnitModel> m_whenDeviceChanged = new();
static Dictionary<string, UnitModel> m_units = new();
public static void Main()
Console.WriteLine($"Hello World {DateTime.Now}");
m_whenDeviceChanged.GroupBy(u => u.Name)
.Select(g => g.DistinctUntilChanged().Throttle(TimeSpan.FromSeconds(1))).Subscribe(u => OnDeviceUpdated(u));
System.Threading.Thread.Sleep(1000);
var name = (i % 3).ToString();
if (m_units.ContainsKey(name))
Console.WriteLine($"update {name}");
var unit = m_units[name];
m_whenDeviceChanged.OnNext(unit);
Console.WriteLine($"add {name}");
var newUnit = new UnitModel(){Name = name};
m_whenDeviceChanged.OnNext(newUnit);
Console.WriteLine("Bye");
private static void OnDeviceUpdated(IObservable<UnitModel> unitObs)
Console.WriteLine($"{DateTime.Now} Subscribe to");
unitObs.Subscribe(OnDeviceUpdated);
private static void OnDeviceUpdated(UnitModel unit)
Console.WriteLine($"{DateTime.Now} Unit changed {unit.Name}-{unit.State}");
public string Name {get;set;}
public int State{get;set;}