Skip to content

Instantly share code, notes, and snippets.

@runceel
Created January 25, 2019 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save runceel/ccac2530eab8acb876bb571aea389a37 to your computer and use it in GitHub Desktop.
Save runceel/ccac2530eab8acb876bb571aea389a37 to your computer and use it in GitHub Desktop.
using System;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Tasks;
using Reactive.Bindings;
namespace RxLab
{
class Program
{
static async Task Main(string[] args)
{
var sensor = new ChatteringSensor();
sensor.Value.Throttle(TimeSpan.FromMilliseconds(200))
.Subscribe(x => Console.WriteLine($"Throttle: {x}"));
Console.WriteLine("---- Start ----");
await sensor.OnAsync();
await Task.Delay(1000);
await sensor.OnAsync();
await Task.Delay(1000);
await sensor.OffAsync();
await Task.Delay(1000);
await sensor.OffAsync();
await Task.Delay(1000);
}
}
class ChatteringSensor
{
private Random Random { get; } = new Random();
private Subject<bool> Source { get; } = new Subject<bool>();
public ReadOnlyReactiveProperty<bool> Value { get; }
public ChatteringSensor()
{
Value = Source.ToReadOnlyReactiveProperty(mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe);
}
public Task OnAsync()
{
return Task.Run(async () =>
{
var count = Random.Next(10) + 5;
for (var i = 0; i < count; i++)
{
Source.OnNext(Random.Next() % 2 == 0);
await Task.Delay(Random.Next(100));
}
Source.OnNext(true);
});
}
public Task OffAsync()
{
return Task.Run(async () =>
{
var count = Random.Next(10) + 5;
for (var i = 0; i < count; i++)
{
Source.OnNext(Random.Next() % 2 == 0);
await Task.Delay(Random.Next(100));
}
Source.OnNext(false);
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment