Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. class SingleThreadSyncContext : SynchronizationContext
  2. {
  3. List<(SendOrPostCallback, object)> calls = new List<(SendOrPostCallback, object)>();
  4. List<(SendOrPostCallback, object)> calls2 = new List<(SendOrPostCallback, object)>();
  5. public override void Post(SendOrPostCallback d, object state)
  6. {
  7. lock (calls)
  8. {
  9. calls.Add((d, state));
  10. }
  11. }
  12.  
  13. public override void Send(SendOrPostCallback d, object state)
  14. {
  15. Console.WriteLine($"send on thread {Thread.CurrentThread.ManagedThreadId}");
  16. base.Send(d, state);
  17. }
  18.  
  19. public void Tick()
  20. {
  21. List<(SendOrPostCallback, object)> callsLocked = null;
  22. lock (calls)
  23. {
  24. callsLocked = calls;
  25. calls = calls2;
  26. calls2 = callsLocked;
  27. }
  28. foreach (var call in callsLocked)
  29. {
  30. call.Item1(call.Item2);
  31. }
  32. callsLocked.Clear();
  33. }
  34. }
  35.  
  36.  
  37. internal class Program
  38. {
  39. static bool finish = false;
  40. static async void DoAsync()
  41. {
  42. Console.WriteLine($"1 curr thread {Thread.CurrentThread.ManagedThreadId}");
  43. Console.WriteLine($"2 curr context {SynchronizationContext.Current}");
  44. Thread.Sleep(10);
  45. await Task.Delay(100);
  46.  
  47. Console.WriteLine($"2 curr thread {Thread.CurrentThread.ManagedThreadId}");
  48. Console.WriteLine($"2 curr context {SynchronizationContext.Current}");
  49. Thread.Sleep(10);
  50. await Task.Delay(100);
  51.  
  52. Thread.Sleep(10);
  53. Console.WriteLine($"3 curr thread {Thread.CurrentThread.ManagedThreadId} wait");
  54. finish = true;
  55. }
  56.  
  57. public const long ticksPerSecond = 30 * 10000;
  58.  
  59. public static void Main(string[] args)
  60. {
  61. var context = new SingleThreadSyncContext();
  62. SynchronizationContext.SetSynchronizationContext(context);
  63. DoAsync();
  64.  
  65. var timer = Stopwatch.StartNew();
  66. var timerForDt = Stopwatch.StartNew();
  67. while (finish == false)
  68. {
  69. var t = timer.ElapsedTicks;
  70. context.Tick();
  71. var timeToWait = ticksPerSecond - timer.ElapsedTicks;
  72. if (timeToWait > 0)
  73. Thread.Sleep((int)timeToWait / 10000);
  74. }
  75.  
  76. Console.ReadKey();
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement