UnitySynchronizationContext.cs 890 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5. public class UnitySynchronizationContext : SynchronizationContext
  6. {
  7. private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> queue = new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
  8. public string Name { get; }
  9. public event EventHandler Activated;
  10. public UnitySynchronizationContext(string name)
  11. {
  12. Name = name;
  13. }
  14. public void Activate()
  15. {
  16. Activated?.Invoke(this, EventArgs.Empty);
  17. Activated = null;
  18. }
  19. public override void Post(SendOrPostCallback d, object state)
  20. {
  21. queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state));
  22. }
  23. public void ExecutePendingContinuations()
  24. {
  25. KeyValuePair<SendOrPostCallback, object> workItem;
  26. while (queue.TryTake(out workItem))
  27. {
  28. workItem.Key(workItem.Value);
  29. }
  30. }
  31. }