度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1987|回复: 4
打印 上一主题 下一主题

[分享] 多线程使用小结

[复制链接]

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
跳转到指定楼层
楼主
发表于 2020-7-5 17:12:55 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
线程一般应用于计算密集型操作,或者想达到异步效果。
创建线程,销毁线程都需要消耗资源,所以线程不是越多越好。C#提供了线程池对象,线程池的好处是线程可以重复利用,并发数也会自动控制,微软不建议用户修改最大并发数。
线程分为前端线程和后台线程,区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。C#创建的线程默认为前端线程,可以通过Thread类IsBackground来设置是否为后台线程(必须在Start方法之前设置)。
Task实际上是使用的线程池中的线程,使用起来比线程池简单方便。Parallel中使用的线程有可能是线程池中的,也可能不是。
线程同步:
对于简单的数字运算,应该使用InterLocked这种轻量级锁对象。对于文件流操作应该使用ReaderWriterLockSlim对象。
其它情况可以使用Monitor,Mutex(互斥锁)或Semaphore。
lock(obj)相当于使用Monitor对象,obj对象即临界区,一般为(new object),不可以使值类型对象,string(或单例对象),或this对象。值类型使用时会发生装箱操作,使每次产生的临界区都不一样,起不到互斥作用。string类型由于内存驻留技术,所有的“abc”实际上都是同一对象,会使得其它使用“abc”的地方可能需要长时间等待(单例对象也是一样)。this对象在外面如果被lock可能会产生死锁。
Mutex比较重量级,一般用于进程间同步。
Semaphore的好处是可以进行并发数控制。
也可以使用信号量进行复杂同步控制,值得注意的是ManualResetEvent和AutoResetEvent的区别是ManualResetEvent在调用Set方法之后,所有等待线程均继续执行,而AutoResetEvent在调用Set方法之后随即有一个线程继续执行。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
5#
 楼主| 发表于 2020-7-7 15:27:05 | 只看该作者
回复 支持 反对

使用道具 举报

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
地板
 楼主| 发表于 2020-7-7 15:26:32 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
板凳
发表于 2020-7-6 14:30:23 | 只看该作者
回复

使用道具 举报

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
沙发
 楼主| 发表于 2020-7-5 17:13:19 | 只看该作者
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-23 22:31 , Processed in 0.115561 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表