热门IT资讯网

非UI的子线程再启动线程的话,等待的时候会被阻塞,Task不会阻塞了

发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,需要在.Net 4.0才会有Task当然,既然接触到了Task,或许以后就不再用线程了,具体看情况了,之前几个线程之间就发生了阻塞问题,这次就是要解决这个问题才下这个功夫的,否则宁可被差遣抱儿子尿尿去

需要在.Net 4.0才会有Task

当然,既然接触到了Task,或许以后就不再用线程了,具体看情况了,之前几个线程之间就发生了阻塞问题,这次就是要解决这个问题才下这个功夫的,否则宁可被差遣抱儿子尿尿去。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading;
  7. namespace TaskDemo
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. Thread mTH = new Thread(RunTask);
  14. mTH.Start();
  15. //Thread mTH1 = new Thread(RunThread);
  16. //mTH1.Start();
  17. }
  18. private static void RunThread()
  19. {
  20. for (int i = 0; i < 20; i++)
  21. {
  22. Thread.Sleep(2);
  23. Console.WriteLine("RunThread{0}", i);
  24. }
  25. }
  26. private static void RunTask()
  27. {
  28. try
  29. {
  30. int mCount = 0;
  31. CancellationTokenSource tokenSource = new CancellationTokenSource();
  32. CancellationToken token = tokenSource.Token;
  33. Task t = new Task(() =>
  34. {
  35. Console.WriteLine("进入任务……");
  36. Thread.Sleep(10);
  37. Console.WriteLine("任务开始工作……");
  38. //模拟工作过程
  39. for (int i = 0; i < 20; i++)
  40. {
  41. if (token.IsCancellationRequested == true)
  42. {
  43. break; //这里别人是用一个throw new OperationCanceledException(token); 但是我用就会报错
  44. }
  45. mCount++;
  46. Console.WriteLine("RunTask{0}", i);
  47. Thread.Sleep(1);
  48. }
  49. }, token);
  50. token.Register(() =>
  51. {
  52. Console.WriteLine("Canceled");
  53. });
  54. t.Start();
  55. Console.WriteLine("这条语句先运行完毕了……");
  56. t.ContinueWith((task) =>
  57. {
  58. Console.WriteLine("任务完成,完成时候的状态为:");
  59. Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}\tmCount={3}", task.IsCanceled, task.IsCompleted, task.IsFaulted, mCount);
  60. });
  61. Console.WriteLine("现在就按任意键的话,程序就退出了……");
  62. RunThread(); //线程内部较耗时的测试
  63. Console.ReadKey(); //由于两个sleep都有点时间,如果在这时间之前按下任意键,结果是程序提前终止了
  64. tokenSource.Cancel();
  65. Console.ReadKey(); //程序退出
  66. }
  67. catch (Exception Ex)
  68. {
  69. Console.WriteLine(Ex.Message);
  70. }
  71. }
  72. }
  73. }
0