UnitTestSynchronizationContext.cs 1.8 KB

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