TerminalScheduler.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. object timeout = null;
  24. var composite = new CompositeDisposable (2) {
  25. Disposable.Create (() => Application.MainLoop.RemoveTimeout (timeout))
  26. };
  27. timeout = Application.MainLoop.AddTimeout (dueTime, args => {
  28. composite.Add(action (this, state));
  29. Application.MainLoop.RemoveTimeout (timeout);
  30. return true;
  31. });
  32. return composite;
  33. }
  34. return dueTime == TimeSpan.Zero
  35. ? PostOnMainLoop ()
  36. : PostOnMainLoopAsTimeout ();
  37. }
  38. }
  39. }