CLR via C#:计算限制的异步操作

执行上下文:具有以下特性:
1.执行上下文内部包括安全设置,宿主设置以及逻辑调用上下文数据。
2.CLR自动造成初始线程的执行上下文流向任何辅助线程。但是可以使用ExecutionContext类来阻止执行上下文的流动以提升应用程序的性能。

AggregateException:具有以下特性:
1.InnerExceptions属性:返回一个未处理异常对象集合。
2.GetBaseException函数:返回作为问题根源的最内层的AggregateException对象。
3.Flatten函数:返回一个新的AggregateException对象。该对象的InnerExceptions属性值是通过遍历原始AggregateException对象的内层异常层次结构而生成的。
4.Handle函数:作为每个未处理异常对象都调用的回调函数。该函数返回true表示异常对象已处理;返回false表示异常对象未处理,此时就会创建一个新的AggregateException对象,其中只包含未处理的异常对象,然后抛出该AggregateException对象。

CancellationToken:具有以下特性:
1.None属性:获取一个不和任何的CancellationTokenSource对象关联的CancellationToken对象。
2.CanBeCanceled属性:当CancellationToken对象可以被关联的CancellationTokenSource对象取消时,就返回true;否则就返回false。
3.IsCancellationTokenRequested属性:当CancellationToken对象被关联的CancellationTokenSource对象取消时,就返回true;否则就返回false。
4.ThrowIfCancellationRequested函数:当CancellationToken对象被关联的CancellationTokenSource对象取消时,就抛出一个OperationCanceledException;否则就直接返回。

CancellationTokenSource:具有以下特性:
1.Token属性:获取跟当前CancellationTokenSource对象关联的CancellationToken对象。
2.Register函数:用来登记在取消CancellationToken对象时调用的回调函数。
参数信息如下所示:
1>.一个用来存储回调函数的委托对象。
2>.一个要通过委托对象传递给回调函数的状态值。
3>.一个是否要使用调用线程的SynchronizationContext对象来调用委托对象。
返回值信息如下所示:
1>.返回一个CancellationTokenRegistration对象,可以通过该对象的Dispose函数来从关联的CancellationTokenSource对象中移除已登记的回调函数。
3.Cancel函数:用来取消CancellationToken对象。如果没有登记回调函数或者登记的所有回调函数都没有抛出未处理异常时,Cancel函数就直接返回,不抛出任何异常;否则当参数为true时,第一个抛出未处理异常的回调函数会阻止其他回调函数的执行,然后在Cancel函数中重新抛出该异常;否则当所有回调函数都被调用后,就在任何一个抛出未处理异常的回调函数中抛出一个AggregateException。
4.CancelAfter函数:用来在等待指定时间后再执行Cancel函数。
5.CreateLinkedTokenSource函数:用来获取将多个CancellationToken对象链接起来的CancellationTokenSource对象。

Task:具有以下特性:
1.Run函数:创建并返回一个Task对象;然后调用Start函数来启动该Task对象。
2.Wait函数:线程调用Wait函数时,系统检查线程要等待的Task对象是否已经开始执行。如果是,调用Wait的线程会阻塞,直到Task对象运行结束为止。但如果Task对象还没开始执行,系统可能使用调用Wait的线程来执行Task对象。在这种情况下,调用Wait的线程不会阻塞,它会执行Task对象并立即返回。
3.WaitAny函数:当该函数发生超时时就返回-1;否则当通过取消CancellationToken对象来取消该函数时就抛出OperationCanceledException;否则当Task对象数组参数中任何的Task对象完成时就返回该Task对象在数组中的索引;否则就阻塞调用线程。
4.WaitAll函数:当该函数发生超时时就返回false;否则当通过取消CancellationToken对象来取消该函数时就抛出OperationCanceledException;否则当Task对象数组参数中所有的Task对象都完成时就返回true;否则就阻塞调用线程。
5.ContinueWith函数:首先创建并返回一个延续Task对象;然后当前置Task对象执行了指定TaskContinuationOptions枚举操作时,就启动该延续Task对象。其中TaskContinuationOptions枚举操作如下表所示:

枚举名说明
None默认
PreferFairness提议TaskScheduler你希望延续Task对象尽快执行
LongRunning提议TaskScheduler应尽可能地创建线程池线程
AttachedToParent该提议总是被采纳:将延续Task对象和前置Task对象建立父子连接
DenyChildAttach延续Task对象试图和前置Task对象建立父子连接将抛出一个InvalidOperationException
HideScheduler强迫延续Task对象使用默认调度器而不是前置Task对象的调度器
LazyCancellation除非前置Task对象完成,否则禁止延续Task对象完成或者取消
ExecuteSynchronously线程执行完成前置Task对象后,同步执行延续Task对象
NotOnRanToCompletion前置Task对象出错或者取消时才执行延续Task对象
NotOnFaulted前置Task对象完成或者取消时才执行延续Task对象
NotOnCancelled前置Task对象完成或者出错时才执行延续Task对象
OnlyOnCancelled前置Task对象取消时才执行延续Task对象
OnlyOnFaulted前置Task对象出错时才执行延续Task对象
OnlyOnRanToCompletion前置Task对象完成时才执行延续Task对象

6.当使用TaskCreateOptions.AttachedToParent标志将一个Task子对象和创建它的Task父对象关联时,只有当Task子对象结束运行,此时Task父对象才算结束。
7.TaskStatus枚举表示Task对象的状态。具体信息如下表所示:

枚举名说明
CreatedTask对象已经显示创建;可以手动调用Start函数来启动该对象
WaitingForActivationTask对象已经隐式创建;会自动调用Start函数来启动该对象
WaitingToRunTask对象已经被调度,但尚未运行
RunningTask对象正在运行
WaitingForChildrenToCompleteTask对象正在等待它的Task子对象完成,Task子对象完成后,该Task对象才完成
RanToCompletionTask对象运行完成
CanceledTask对象取消
FaultedTask对象出错

8.IsCanceled属性:判断Task对象是否处于TaskStatus.Canceled状态,如果是就返回true;否则就返回false。
9.IsFaulted属性:判断Task对象是否处于TaskStatus.Faulted状态,如果是就返回true;否则就返回false。
10.IsCompleted属性:判断Task对象是否处于TaskStatus.RanToCompletion或者TaskStatus.Faulted或者TaskStatus.Canceled状态,如果是就返回true;否则就返回false。
11.Result属性:当Task对象处于TaskStatus.RanToCompletion状态时,可以使用该属性来查询结果。
12.Exception属性:当Task对象处于TaskStatus.Faulted状态时,可以使用该属性来获取AggregateException对象。
13.WhenAll函数:新建一个Task / Task<TResult[]>对象。当数组参数中所有的Task对象都完成时,该新建的Task / Task<TResult[]>对象才完成。
14.WhenAny函数:新建一个Task<Task> / Task<Task<TResult>>对象。当数组参数中任何一个Task对象完成时,该新建的Task<Task> / Task<Task<TResult>>对象才完成。
15.Task相对线程而言,有以下优势:
1>.Task使用的内存比线程少的多,创建和销毁所需的时间也少的多。
2>.线程池可以根据CPU的数量自动伸缩Task规模。
3>.每个Task完成一个阶段后,运行Task的线程回到线程池,在那里接受新的Task。
4>.线程池总是站在整个进程的高度观察Task。所以它能更好的调度这些Task,减少进程中的线程数,并减少上下文切换。

TaskFactory:具有以下特性:
1.TaskFactory对象用来存储具有相同CancellationToken,TaskScheduler,TaskCreationOptions以及TaskContinuationOptions配置的Task对象。
2.无论前置Task对象是如何完成的,ContinueWhenAll和ContinueWhenAny都会执行延续Task对象。
3.FromAsync函数用来将基于BeginXXX函数和EndXXX函数的异步编程模型转换成基于Task的异步编程模型。但是尽量不要使用IAsyncResult类型作为参数的FromAsync函数,因为它们性能低效。

TaskScheduler:具有以下特性:
1.UnobservedTaskException事件:用来登记一个回调函数。每当一个Task对象被垃圾回收时,如果存在一个没有被注意到的异常对象,CLR的终结器线程就会引发这个事件,然后向事件回调函数里面传递一个包含该异常对象的UnobservedTaskExceptionEventArgs对象。
2.Default属性:用来获取默认任务调度器的引用。要么是线程池任务调度器;要么是同步上下文任务调度器。
3.FromCurrentSynchronizationContext函数:用来获取同步上下文任务调度器的引用。

Parallel:具有以下特性:
1.For/ForEach函数:通过线程池的线程来并行遍历集合。
参数具有以下特性
1>.任务局部初始化委托(localInit):为参与工作的每个任务都调用一次该委托。这个委托是在任务被要求处理一个工作项之前调用的。
2>.主体委托(body):为参与工作的各个线程所处理的每一项都调用一次该委托。该委托接收一个ParallelLoopState对象参数来跟其他任务进行交互的方式如下所示:
1>>.Stop函数:告诉循环停止处理任何更多的工作。
2>>.IsStop属性:当调用了Stop函数就返回true;否则返回false。
3>>.Break函数:告诉循环不再处理当前项之后的项。
4>>.LowestBreakIteration属性:返回在处理过程中调用Break函数的最低项。如果从没调用过Break函数就返回null。
5>>.IsExceptional属性:处理任何一项时,如果造成未处理异常就返回true;否则就返回false。
6>>.ShouldExitCurrentIteration:如果调用过Stop函数或者调用过Break函数或者取消过CancellationToken对象或者处理一项时造成未处理的异常,该属性就返回true;否则就返回false。
3>.任务局部终结委托(localFinally):为参与工作的每个任务都调用一次该委托。这个委托是在任务处理好派发给它的所有工作项之后调用的。即使主体委托代码引发一个未处理的异常,也会调用它。
返回值具有以下特性
1>.返回值类型为ParallelLoopResult。当IsCompleted属性返回true时就表明循环运行完成;当IsCompleted属性返回false并且LowestBreakIteration属性为null时就表明参与工作的某个线程调用了Stop函数;当IsCompleted属性返回false并且LowestBreakIteration属性不为null时就表明参与工作的某个线程调用了Break函数;当捕获了AggregateException时就表明参与工作的某个线程造成未处理的异常。
2.Invoke函数:通过线程池的线程来并行调用函数。
3.不要使用Parallel的情况如下所示:
1>.工作项不能并行处理。
2>.工作项数量少或者工作项不涉及大量工作。

PLINQ:也叫做并行语言集成查询。具有以下特性:
1.LINQ会使用一个线程来顺序查询集合中的数据项;PLINQ会使用TaskScheduler来并行查询集合中的数据项。
2.ParallelEnumerable类实现了PLINQ的所有功能。具有以下特性:
1>.AsParallel函数:用来将基于IEnumerable或者IEnumerable的顺序查询对象转换成基于ParallelQuery或者ParallelQuery的并行查询对象。
2>.AsSequential函数:用来将基于ParallelQuery或者ParallelQuery的并行查询对象转换成基于IEnumerable或者IEnumerable的顺序查询对象。
3>.ForAll函数:多线程遍历并行查询对象。
4>.AsOrder函数:获取排序数据项的并行查询对象。
5>.AsUnorder函数:获取不排序数据项的并行查询对象。
6>.WithCancellation函数:允许通过取消CancellationToken对象来停止查询。
7>.WithDegreeOfParallelism函数:允许多少个线程来处理查询。
8>.WithExecutionMode函数:按照指定的方式来查询。其中ParallelExecutionMode定义如下表所示:

枚举名说明
Default让并行查询对象自己决定查询方式
ForceParallelism强迫并行查询对象使用并行查询方式

9>.WithMergeOptions函数:按照指定的方式来缓存与合并结果。其中ParallelMergeOptions定义如下表所示:

枚举名说明
Default等价于AutoBuffered
NotBuffered结果一旦就绪就开始处理。该方式最省内存但速度最慢
FullyBuffered每个线程在处理前缓冲所有结果。该方式最耗内存但速度最快
AutoBuffered每个线程在处理前缓冲一些结果。该方式内存消耗和运行速度介于NotBuffered和FullyBuffered之间

Timer:可以让线程池线程定时调用一个函数。具有以下特性:
1.Time对象执行流程如下所示:
1>.当dueTime等于-1时,就不启动Timer对象;否则就启动Timer对象,然后执行流程2。
2>.当等待了指定dueTime时间后,就用state作为参数来调用callback函数,然后执行流程3。
3>.当period<=0时,就停止Timer对象;否则就执行流程4。
4>.每当轮询指定period时间后,就用state作为参数来调用callback函数。
2.Dispose(notifyObject):用来取消Timer对象。当已经展开的回调函数被处理完后,就会向notifyObject参数标识的内核对象发出信号。

线程池:具有以下特性:
1.不要尝试去重写一个线程池,因为CLR的线程池性能和稳定性上都相对较好一些。
2.不要尝试去理解线程池是如何管理工作线程和IO线程的,因为CLR的线程池一直再优化。
3.CLR允许开发人员设置线程池要创建的最大线程数。但实践证明,线程池永远都不应该设置线程数上限,因为可能发生饥饿或者死锁。
4.工作者线程获取工作项的流程如下所示:
1>.当工作者线程的本地队列不为空时,就从该队列中按照后入先出的算法来获取一个工作项。
2>.当所有本地队列不为空但是工作者线程的本地队列为空时,就从其他工作者线程的本地队列中按照先入先出的算法获取一个工作项。
3>.当所有本地队列为空但是全局队列不为空时,工作者线程就从全局队列中按照先入先出的算法获取一个工作项。
4>.当所有本地队列和全局队列都为空时,工作者线程就会处于睡眠状态。当睡眠了一段时间后就会自动唤醒并销毁自己。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值