请选择 进入手机版 | 继续访问电脑版

[C#教程] C#多线程开发 实战记录之线程基础

[复制链接]
查看71 | 回复4 | 2021-9-14 09:51:31 | 显示全部楼层 |阅读模式
目次

前言

近来 由于工作的必要 ,不停 在使用 C#的多线程举行 开辟 ,此中 也碰到 了很多题目 ,但也都办理 了。后来发觉本身 对于线程的知识和运用不是很熟悉 ,以是 将使用 几篇文章来体系 性的学习汇总下C#中的多线程开辟 。

线程基础

进程 是操作体系 分配资源的最小单元,线程是操作体系 调度的最小单元” 这句话应该学习计算机的朋侪 或多或少都听说过,这在操作体系 这门课中是很紧张 的一个概念。

在操作体系 中可以同时运行很多个应用程序,那么你知道计算机是怎样 分配和调度这些应用程序去使用 CPU举行 工作的吗?

这内里 就牵涉 到了进程 、线程的概念,也就是我们接下来要学习的内容。

一个应用程序会有很多个线程,但是只能有一个进程 。也就是说一个进程 中可以有很多个线程。那么这是为什么呢?从前 计算机只有一个计算模块,每次只能单一的实行 一个计算单元,不能同时实行 多个计算使命 。如今 随着科技的发展,有了多核CPU,可以一次性实行 多个应用程序,如许 就实现了多使命 。操作体系 为了不让一个应用程序独占CPU,导致别的 程序挂起等待,不得不计划 出一种将物理计算单元分割为一些假造 的进程 ,并给予每个实行 程序肯定 量的计算本领 。此外,操作体系 必须始终可以或许 优先访问CPU,并能调整不同程序访问CPU的优先级(说白了就是典型的以空间换时间)。

线程正是这一概念的实现,可以以为 线程是一个假造 的进程 ,用于独立运行一个特定的程序。

  1. 大量使用线程会消耗大量的OS资源
复制代码

那么为什么必要 使用 线程呢!实在 就是为了在类似 的时间内,让操作体系 或CPU干更多的活,那么在C#中线程应该怎样 使用 或者说在什么场景下使用 呢!

在C#中关于线程的使用 ,大多数时间 是在当程序必要 处理大量繁琐、占用资源多、花费大量时间的使命 时举行 应用,比如访问数据库,视频表现 ,文件IO操作、网络传输等。

线程在应用程序中可以举行 怎样 操作:1、创建线程;2、停息 线程;3、线程等待;4、制止 线程。

1、创建线程

通过声明并实例化Thread就可以创建线程,它吸取 方法作为参数。使用 Thread.Start()就可以开启子线程,让其去实行 方法中的内容。

  1. static void Main(string[] args)
  2. {
  3. //新创建的线程中输出
  4. Thread oneThread = new Thread(PrintNumber);
  5. oneThread.Start();
  6. //主线程中输出
  7. PrintNumber();
  8. Console.ReadKey();
  9. }
  10. static void PrintNumber()
  11. {
  12. Console.WriteLine("开始......");
  13. for (int i = 0; i < 10; i++)
  14. {
  15. Console.WriteLine(i);
  16. }
  17. }
复制代码

C#多线程开发

实战记录之线程基础

可以看到当我们在子线程和主线程中同时输出PrintNumber()中的内容时,它是乱的随机交叉输出的。

2、停息 线程

停息 线程故名思意就是让线程停息 ,不让其占用CPU资源,在不停 等待,啥时间 取消停息 就恢复运行。在C#中停息 就是让这个线程进入就寝 状态,让其休眠,不让其占用体系 资源就可以了。

  1. Thread.Sleep(TimeSpan.FromSeconds(2)); //睡眠2s
复制代码

3、线程等待

线程等待就是多个线程在处理某个使命 时,某个线程必须等待前一个线程处理全部 数据后才可以举行 实行 ,在这个期间,这个线程是壅闭 状态的。只有前一个线程完事了,他才可以再继续实行 。

  1. static void Main(string[] args)
  2. {
  3. //新创建的线程中输出
  4. Thread oneThread = new Thread(PrintNumber);
  5. oneThread.Start();
  6. oneThread.Join();
  7. //主线程中输出
  8. PrintNumber();
  9. Console.ReadKey();
  10. }
复制代码

也就是说上面的程序主线程必须得等oneThread线程实行 完PrintNumber方法后,它才可以实行 。

4、线程制止

就是线程在实行 过程中,使用 某些操作(Thread.Abort())可以使其线程立刻 退出,不举行 工作了。

  1. static void Main(string[] args)
  2. {
  3. //新创建的线程中输出
  4. Thread oneThread = new Thread(PrintNumber);
  5. oneThread.Start();
  6. Thread.Sleep(TimeSpan.FromSeconds(6));
  7. oneThread.Abort();
  8. //主线程中输出
  9. PrintNumber();
  10. Console.ReadKey();
  11. }
复制代码

上面的程序可以看到,当主程序再等待6s后,立刻 将oneThread线程制止 掉。

实在 Abort()方法是给线程注入了ThreadAbortException方法,导致线程被闭幕 ,这实在 很伤害 ,由于 该线程大概 正在处理某些紧张 的数据,比如吸取 传输数据等,如许 子就传递摧毁了程序,数据也就丢失了。还有就是这个方法不能保证100%制止 线程。偶尔 候有些非常 会被吃掉,我们可以使用 某些关键变量在子线程中举行 控制,从而取消线程的实行 就可以。

在实际 编码使用 线程的过程中,可以通过oneThread.ThreadState来获取目火线 程的状态。偶尔 候我们也可以手动的设置线程的优先级,设置为最高的则提前实行 ,但是这个只是针对于单核CPU时,如今 市面上基本都是多核的了,这种使用 场景也就很少了。

一样平常 我们创建的线程都是属于前台线程,通过手动设置ontThread对象的IsBackground属性为true时才会为后台线程。通常前台线程会比后台线程提前实行 完。当前台线程实行 完成后,程序竣事 并且后台线程被闭幕 。进程 会等待全部 的前台线程完成后再竣事 工作,但是假如 只剩下后台线程,进程 会直接竣事 工作。

C#中的lock关键字

某一个资源当被多个线程同时访问时,大概 这个资源的某些值对于各个线程来说会出题目 。假如 在某一时候 ,一个线程是使其递增,一个线程是递减,会导致其值不唯一,各个线程拿到的值不对。这种环境 就是所谓的竞争条件,竞争条件是多线程环境中非常常见的导致错误的缘故起因 。

  1. class PepoleCount
  2. {
  3. int count = 0;
  4. public void AddCount()
  5. {
  6. ++count;
  7. }
  8. public void DeleteCount()
  9. {
  10. --count;
  11. }
  12. }
复制代码

比如是上面的程序,当两个线程同时访问这个PepoleCount类时,会导致count变量出现竞争条件。就是每个线程大概 拿到的数值不是最新的。那么怎样 办呢,此时就必要 使用 到lock机制,也就是加锁。目标 是为了当一个线程访问某个资源时,别的 线程假如 在访问时,必须等待当前访问完过后 ,它才可以访问。保证了数据的有效 性。

lock关键字是假如 锁定了一个对象,必要 访问该对象的全部 其他线程则会处于壅闭 状态,并等待知道该对象排除 锁定才可以访问。

  1. class PepoleCount
  2. {
  3. private readonly object _syncRoot = new object();
  4. int count = 0;
  5. public void AddCount()
  6. {
  7. lock(_syncRoot)
  8. {
  9. ++count;
  10. }
  11. }
  12. public void DeleteCount()
  13. {
  14. lock(_syncRoot)
  15. {
  16. --count;
  17. }
  18. }
  19. }
复制代码

关于加锁这块还是有很多讲究的,不是说每一个方法,每一个变量都必要 举行 加锁,假如 频仍 的加锁会导致别的 线程处于壅闭 状态,那么也会导致应用程序出现严峻 的性能题目 。

总结

到此这篇关于C#多线程开辟 实战记录之线程基础的文章就先容 到这了,更多干系 C#多线程基础内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 哈哈笑417 | 2021-9-22 10:42:10 | 显示全部楼层
鸟大了,什么林子都敢进啊!
回复

使用道具 举报

avatar 123457875 | 2021-9-27 12:05:24 | 显示全部楼层
admin楼主是一个神奇的青年!
回复

使用道具 举报

avatar 我心如烟卸 | 2021-10-5 03:47:32 | 显示全部楼层
记得吃药!
回复

使用道具 举报

最近回了很多帖子,都没人理我!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则