前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TPL相关

TPL相关

作者头像
Jerremy
发布2022-05-09 14:52:50
3840
发布2022-05-09 14:52:50
举报
文章被收录于专栏:Puppeteer学习Puppeteer学习

C#中的Timer

System.Windows.Forms.Timer System.Threading.Timer

System.Timers.Timer

1.System.Windows.Forms.Timer在激发Timer.Trick的时候,其实是在主线程中执行的,所以可以用来更新所有的UI控件,而不用担心线程安全的问题。

2.System.Threading.Timer和System.Timers.Timer都是基于ThreadPool的,每次执行Timer.Trick的时候都会基于ThreadPool创建一个线程,无法直接线程安全的操作主线程中控件。

协调数据结构

协调数据结构(Coordination Data Structures,CDS)被设计为在并发环境下使用的组件,它也可用于构建复杂的并发框架。此外,它还包含了高级的同步工具,如Barrier,多种线程安全的集合,以及多种构建Future模型的方式。

Barrier类的作用是在多个阶段的操作之间创建同步点。在使用之前,Barrier需要知道有多少线程将会使用它。每个线程达到检查点时,便要调用Barrier的SignalAndWait方法。这么做会引起阻塞,当所有线程都调用了这个方法后,便会同时释放所有线程。这个过程可以重复多次,每个这样的迭代都会增加其CurrentPhaseNumber属性。用于监控的代码可以随时检查正在使用Barrier的线程,以及还没有到达检查点的线程数量。CurrentPhaseNumber为Int64类型,因此每个Barrier可以支持多达9,223,372,036,854,775,807个阶段(之前的beta版本使用Int32,因此受限于40亿个阶段)

任务和数据并行

Parallel.Invoke方法中需要指定确定action委托的数量,如果其数量小于逻辑内核数量的话,那么会有其他的内核空闲,所以该方法不能充分利用系统的内核。 并行度:ParallelOptions类中设置,度数最好设置为Environment.ProcessorCount; 创建新的任务并不一定要创建新的线程,创建新的任务能够从现有的线程中窃取工作,任务和线程并不存在一对一的关系。 默认的任务调度器依赖于底层的线程池引擎。因此,在创建一个新任务时,调度器会使用工作窃取队列找到一个最合适的线程,然后将这个任务加入队列。任务中所包含的代码会在一个线程中运行;然而这一切都是在幕后进行的,其开销的确比手工创建线程的开销要小。 ConcurrentQueue并行队列集合。 ConcurrentStack并行栈,永远没有锁,也永远不会获取到锁的,可能会自旋并且重试操作。

IProducerConsumerCollection<T>被上述集合类实现;

BlockingCollection<T>实现了对IProducerConsumerCollection<T>实现类的包装,有上线和阻塞(block);

BlockingCollection<T>默认封装的是ConcurrentQueue,如果要修改其封装的类型那么可以:

var t=  new BlockingCollection<string>(new ConcurrentStack<string>(),100);红色参数为实现了IProducerConsumerCollection<T>接口的集合。

ConcurrentDictionary是Dictionary的并行版本,是完全无锁的,当很多任务和线程添加或者修改数据的时候,ConcurrentDictionary会使用细粒度的锁,该类中有AddOrUpdate方法,如果存在该键值,就update,否则就add,也有GetOrAdd方法,如果键值存在就获取对应的Value,否则则加入其中新的键值对。也有相应的TryAdd,TryUpdate,TryRemove等方法。

ConcurrentDictionary<T,T1>表示可以由多个线程同时访问的键值对的集合

Thread.VolatileRead(ref ff)无论处理器的数目或者处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值

Interlocked.Increment(ref this._connectionID)以原子操作的形式递增指定变量的值并存储结果

Interlocked类为多个线程共享的变量提供原子操作;

ConcurrentStack线程安全的Stack

Timeout.Infinite用于指定无限长时间的常数

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档