当前位置:   article > 正文

C# 浅谈异步编程 Thread、ThreadPool

C# 浅谈异步编程 Thread、ThreadPool

异步编程


从 .NET Framework 4 开始,使用多线程的推荐方法是使用任务并行库 (TPL) 和并行 LINQ (PLINQ)。
任务并行库(TPL)说的是 System.Threading 和 System.Threading.Tasks 空间中的一组公共类型和 API。较为常见的就是Thread、ThreadPool、Task等
LINQ (PLINQ) 是语言集成查询 (LINQ) 模式的并行实现,可以理解为对LINQ的一些扩充方法,类似于“IEnumerable .AsParallel()”方法。

 

1、Thread和ThreadPoool

1.1、线程Thread

创建和控制线程,设置其优先级并获取其状态。
使用举例:

  1. public static void ThreadProc()
  2. {
  3. for (int i = 0; i < 10; i++)
  4. {
  5. Console.WriteLine("ThreadProc: {0}", i);
  6. Thread.Sleep(1);
  7. }
  8. }
  9. public static void MainThread()
  10. {
  11. Console.WriteLine("Main thread Start.");
  12. Console.WriteLine("Creat a second thread: ThreadProc.");
  13. Thread t = new Thread(new ThreadStart(ThreadProc));
  14. Console.WriteLine("ThreadProc start.");
  15. t.Start();
  16. for (int i = 0; i < 4; i++)
  17. {
  18. Console.WriteLine("Main thread: Do some work.");
  19. Thread.Sleep(1);
  20. }
  21. Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
  22. t.Join();
  23. Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
  24. Console.ReadLine();
  25. }

ThreadStart为系统自带无参委托类型。
Thread的构造函数有如下几种:

  1. public Thread(ThreadStart start)...
  2. public Thread(ParameterizedThreadStart start)...
  3. public Thread(ThreadStart start, int maxStackSize)...
  4. public Thread(ParameterizedThreadStart start, int maxStackSize)...

1.2、线程池ThreadPoool

先说说进程,进程是一种正在执行的程序,操作系统使用进程来分隔正在执行的应用程序。

可以把线程池比喻成公路,一个进程只有一条公路,一条公路(线程池)上可以有多个车道。即是说一个进程只能有一个线程池,而线程池中可以有多个线程,而具体可以有多少线程呢,是受到计算机内存等限制的。

C#中可以使用 ThreadPool.GetMaxThreads 和 ThreadPool.SetMaxThreads 方法来控制最大线程数。
使用示例:

  1. public static void ThreadProc(object stateInfo)
  2. {
  3. for (int i = 0; i < 5; i++)
  4. {
  5. Console.WriteLine("ThreadProc: {0},stateInfo: {1}", i, stateInfo);
  6. Thread.Sleep(1);
  7. }
  8. }
  9. public static void MainThreadPool()
  10. {
  11. ThreadPool.QueueUserWorkItem(ThreadProc, "state");
  12. Console.WriteLine("Main thread does some work, then sleeps.");
  13. Thread.Sleep(1000);
  14. Console.WriteLine("Main thread exits.");
  15. }

输出:

  1. Main thread does some work, then sleeps.
  2. ThreadProc: 0,stateInfo: state
  3. ThreadProc: 1,stateInfo: state
  4. ThreadProc: 2,stateInfo: state
  5. ThreadProc: 3,stateInfo: state
  6. ThreadProc: 4,stateInfo: state
  7. Main thread exits.

ThreadPool为静态类,只能操作当前进程的线程池。
常用方法除了GetMaxThreads() 和 SetMaxThreads()外,还有上面使用示例中出现的:
QueueUserWorkItem(WaitCallback callBack, object state)
QueueUserWorkItem(WaitCallback callBack)
即将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。
参数WaitCallBack是一个内置委托(如下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/931175
推荐阅读
相关标签