Program.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using ETModel;
  5. namespace Example2_2
  6. {
  7. class Program
  8. {
  9. private static int loopCount = 0;
  10. static void Main(string[] args)
  11. {
  12. OneThreadSynchronizationContext _ = OneThreadSynchronizationContext.Instance;
  13. Console.WriteLine($"主线程: {Thread.CurrentThread.ManagedThreadId}");
  14. Crontine();
  15. while (true)
  16. {
  17. OneThreadSynchronizationContext.Instance.Update();
  18. Thread.Sleep(1);
  19. ++loopCount;
  20. if (loopCount % 10000 == 0)
  21. {
  22. Console.WriteLine($"loop count: {loopCount}");
  23. }
  24. }
  25. }
  26. private static async void Crontine()
  27. {
  28. await WaitTimeAsync(5000);
  29. Console.WriteLine($"当前线程: {Thread.CurrentThread.ManagedThreadId}, WaitTimeAsync finsih loopCount的值是: {loopCount}");
  30. await WaitTimeAsync(4000);
  31. Console.WriteLine($"当前线程: {Thread.CurrentThread.ManagedThreadId}, WaitTimeAsync finsih loopCount的值是: {loopCount}");
  32. await WaitTimeAsync(3000);
  33. Console.WriteLine($"当前线程: {Thread.CurrentThread.ManagedThreadId}, WaitTimeAsync finsih loopCount的值是: {loopCount}");
  34. }
  35. private static Task WaitTimeAsync(int waitTime)
  36. {
  37. TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
  38. Thread thread = new Thread(()=>WaitTime(waitTime, tcs));
  39. thread.Start();
  40. return tcs.Task;
  41. }
  42. /// <summary>
  43. /// 在另外的线程等待
  44. /// </summary>
  45. private static void WaitTime(int waitTime, TaskCompletionSource<bool> tcs)
  46. {
  47. Thread.Sleep(waitTime);
  48. // 将tcs扔回主线程执行
  49. OneThreadSynchronizationContext.Instance.Post(o=>tcs.SetResult(true), null);
  50. }
  51. }
  52. }