Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SingleThreadSyncContext : SynchronizationContext
- {
- List<(SendOrPostCallback, object)> calls = new List<(SendOrPostCallback, object)>();
- List<(SendOrPostCallback, object)> calls2 = new List<(SendOrPostCallback, object)>();
- public override void Post(SendOrPostCallback d, object state)
- {
- lock (calls)
- {
- calls.Add((d, state));
- }
- }
- public override void Send(SendOrPostCallback d, object state)
- {
- Console.WriteLine($"send on thread {Thread.CurrentThread.ManagedThreadId}");
- base.Send(d, state);
- }
- public void Tick()
- {
- List<(SendOrPostCallback, object)> callsLocked = null;
- lock (calls)
- {
- callsLocked = calls;
- calls = calls2;
- calls2 = callsLocked;
- }
- foreach (var call in callsLocked)
- {
- call.Item1(call.Item2);
- }
- callsLocked.Clear();
- }
- }
- internal class Program
- {
- static bool finish = false;
- static async void DoAsync()
- {
- Console.WriteLine($"1 curr thread {Thread.CurrentThread.ManagedThreadId}");
- Console.WriteLine($"2 curr context {SynchronizationContext.Current}");
- Thread.Sleep(10);
- await Task.Delay(100);
- Console.WriteLine($"2 curr thread {Thread.CurrentThread.ManagedThreadId}");
- Console.WriteLine($"2 curr context {SynchronizationContext.Current}");
- Thread.Sleep(10);
- await Task.Delay(100);
- Thread.Sleep(10);
- Console.WriteLine($"3 curr thread {Thread.CurrentThread.ManagedThreadId} wait");
- finish = true;
- }
- public const long ticksPerSecond = 30 * 10000;
- public static void Main(string[] args)
- {
- var context = new SingleThreadSyncContext();
- SynchronizationContext.SetSynchronizationContext(context);
- DoAsync();
- var timer = Stopwatch.StartNew();
- var timerForDt = Stopwatch.StartNew();
- while (finish == false)
- {
- var t = timer.ElapsedTicks;
- context.Tick();
- var timeToWait = ticksPerSecond - timer.ElapsedTicks;
- if (timeToWait > 0)
- Thread.Sleep((int)timeToWait / 10000);
- }
- Console.ReadKey();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement