TerminalScheduler.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using System;
  2. using System.Reactive.Concurrency;
  3. using System.Reactive.Disposables;
  4. using Terminal.Gui;
  5. namespace ReactiveExample {
  6. public class TerminalScheduler : LocalScheduler {
  7. public static readonly TerminalScheduler Default = new TerminalScheduler();
  8. TerminalScheduler () { }
  9. public override IDisposable Schedule<TState> (
  10. TState state, TimeSpan dueTime,
  11. Func<IScheduler, TState, IDisposable> action) {
  12. IDisposable PostOnMainLoop() {
  13. var composite = new CompositeDisposable(2);
  14. var cancellation = new CancellationDisposable();
  15. Application.MainLoop.Invoke (() => {
  16. if (!cancellation.Token.IsCancellationRequested)
  17. composite.Add(action(this, state));
  18. });
  19. composite.Add(cancellation);
  20. return composite;
  21. }
  22. IDisposable PostOnMainLoopAsTimeout () {
  23. var composite = new CompositeDisposable (2);
  24. var timeout = Application.MainLoop.AddTimeout (dueTime, args => {
  25. composite.Add(action (this, state));
  26. return false;
  27. });
  28. composite.Add (Disposable.Create (() => Application.MainLoop.RemoveTimeout (timeout)));
  29. return composite;
  30. }
  31. return dueTime == TimeSpan.Zero
  32. ? PostOnMainLoop ()
  33. : PostOnMainLoopAsTimeout ();
  34. }
  35. }
  36. }