ToB企服应用市场:ToB评测及商务社交产业平台

标题: C#多线程 [打印本页]

作者: 光之使者    时间: 2024-5-20 00:55
标题: C#多线程
目录

C#线程

概述

定义
  1. 线程(thread)是计算机科学中将进程划分为两个或多个线程(实例)或子进程,由单处理器(单线程)或多处理器(多线程)或多核处理系统并发执行的一种抽象概念。每个线程都是独立的执行单元,拥有自己的程序计数器、栈、本地存储区和线程标识符。线程可以并发执行多个任务,提高应用程序的性能和响应速度。
复制代码
程序、进程、线程

1个程序至少有1个进程,1个进程至少有1个线程。进程间不可以共享数据,线程之间可以共享同一个进程的数据。
进程是资源分配的基本单元,线程是cup执行的基本单元。

进程之间的通信需要通过进程间通信(IPC)机制举行,而线程之间的通信可以共享内存或使用同步机制举行。
基本语法

C#可以通过Thread、ThreadPool、Task(推荐)创建线程。
  1.   private static void Method(object c)
  2.   {
  3.       MessageBox.Show($"{c.ToString()},当前线程ID:{Thread.CurrentThread.ManagedThreadId}");
  4.   }
  5.   /// <summary>
  6.   /// 1.Thread类是C#中用于创建和管理线程的标准类。new Thread()创建,thread.Start()执行。
  7.   /// </summary>
  8.   public static void ThreadDemo()
  9.   {
  10.       // Thread thread = new Thread(new ThreadStart(Method));//ThreadStart不能传递参数
  11.       Thread thread = new Thread(new ParameterizedThreadStart(Method));//ParameterizedThreadStart 只能传递object参数
  12.       thread.IsBackground = true;//是否后台线程。
  13.       thread.Start("Thread方式创建线程");
  14.   }
  15.   // <summary>
  16.   /// 2.ThreadPool 可以使用QueueUserWorkItem 创建并执行。
  17.   /// </summary>
  18.   private static void ThreadPoolDemo()
  19.   {
  20.       ThreadPool.QueueUserWorkItem(new WaitCallback(Method), "ThreadPool方式创建线程");
  21.   }
  22.   // <summary>
  23.   /// 3.Task 可以使用Task.Run() 或 new TaskFactory().StartNew() 创建并执行线程
  24.   /// </summary>
  25.   private static void TaskDemo()
  26.   {
  27.      Task.Run(() => { Method("Task方式创建线程"); });
  28.      new TaskFactory().StartNew(() => { Method("TaskFactory方式创建线程"); });
  29.   }
复制代码
前台线程和后台线程

共享数据掩护机制

  1. int count = 0;
  2. /// <summary>
  3. /// 5个Task 处理同一个程序Method2, 最后得到累计数据500。
  4. /// </summary>
  5. private void ShareData()
  6. {
  7.     for (int i = 0; i < 5; i++)
  8.     {
  9.         Task.Run(() => { Method2(); });
  10.     }
  11.     Thread.Sleep(1000);
  12.     MessageBox.Show(count.ToString());
  13. }
  14. private static object o = new object();
  15. Semaphore semaphore = new Semaphore(1, int.MaxValue);
  16. public void Method2()
  17. {
  18.      for (int i = 0; i < 100; i++)
  19.      {
  20.          //lock (o)
  21.          //{
  22.          semaphore.WaitOne();
  23.          count++;
  24.          semaphore.Release();
  25.         // }
  26.      }
  27. }
复制代码
优缺点/应用场景

优缺点

常见的应用场景

总结

多个线程可以提高应用程序的整体性能、并发能力、响应速率。但它使程序更难维护和调试。使用时注意共享数据同时修改,数据不一致问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4