UnitTestSynchronizationContext.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reactive.Disposables;
  4. using System.Threading;
  5. namespace Avalonia.Base.UnitTests.Data
  6. {
  7. internal sealed class UnitTestSynchronizationContext : SynchronizationContext
  8. {
  9. readonly List<Tuple<SendOrPostCallback, object>> _postedCallbacks =
  10. new List<Tuple<SendOrPostCallback, object>>();
  11. public static Scope Begin()
  12. {
  13. var sync = new UnitTestSynchronizationContext();
  14. var old = SynchronizationContext.Current;
  15. SynchronizationContext.SetSynchronizationContext(sync);
  16. return new Scope(old, sync);
  17. }
  18. public override void Send(SendOrPostCallback d, object state)
  19. {
  20. d(state);
  21. }
  22. public override void Post(SendOrPostCallback d, object state)
  23. {
  24. lock (_postedCallbacks)
  25. {
  26. _postedCallbacks.Add(Tuple.Create(d, state));
  27. }
  28. }
  29. public void ExecutePostedCallbacks()
  30. {
  31. lock (_postedCallbacks)
  32. {
  33. _postedCallbacks.ForEach(t => t.Item1(t.Item2));
  34. _postedCallbacks.Clear();
  35. }
  36. }
  37. public class Scope : IDisposable
  38. {
  39. private readonly SynchronizationContext _old;
  40. private readonly UnitTestSynchronizationContext _new;
  41. public Scope(SynchronizationContext old, UnitTestSynchronizationContext n)
  42. {
  43. _old = old;
  44. _new = n;
  45. }
  46. public void Dispose()
  47. {
  48. SynchronizationContext.SetSynchronizationContext(_old);
  49. }
  50. public void ExecutePostedCallbacks()
  51. {
  52. _new.ExecutePostedCallbacks();
  53. }
  54. }
  55. }
  56. }