
CLR via C#(第三版) 第V部分 线程处理
文章平均质量分 77
xufei96
SDET .net C#
展开
-
第25章 线程处理(3)
25.6 CLR线程和Windows线程虽然今天的一个CLR线程是直接对应于一个Windows线程,但Microsoft CLR团队保留了将来把它从Windows线程分离的权利。25.7 使用专用线程执行异步的计算限制操作满足一下任何一个条件,就可以显式创建自己的线程:线程需要以非普通线程优先级运行。所有线程池线程都以普通优先级运行;虽然可以更改这个优先级,但不建议那样做。原创 2012-02-09 12:55:32 · 411 阅读 · 0 评论 -
第26章 计算限制的异步操作(11)
26.7 并行语言集成查询(PLINQ)如果同时要处理大量项,或者每一项的处理过程都是一个耗时的计算限制的操作,那么可以从并行LINQ获得最大的利益。静态System.Linq.ParallelEnumerable类(在System.Core.dll中定义)实现了PLINQ的所有功能。为了让自己的Linq to Objects查询调用这些方法的并行版本,必须将自己的顺序查询(基于IEn原创 2012-02-15 13:16:42 · 367 阅读 · 0 评论 -
第26章 计算限制的异步操作(10)
26.6 Parallel的静态For,ForEach和Invoke方法using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ public class Program { static void Main(string[] args原创 2012-02-14 16:33:30 · 107 阅读 · 0 评论 -
第26章 计算限制的异步操作(8)
26.5.5 任务内部揭秘在每个Task对象中,都包含代表Task唯一ID的一个Int32字段。创建一个Task对象时,字段初始化为零。第一次查询Task的只读Id属性时,属性将一个唯一Int32值分配给该字段,并从属性中返回它。TaskID从1开始,每分配一个ID都递增1。这个ID的意义在于,每个Task都可以用一个唯一的值来标识。运行一个任务的代码时,可以查询Task的静态CurrentI原创 2012-02-13 15:05:10 · 491 阅读 · 0 评论 -
第26章 计算限制的异步操作(9)
26.5.7 任务调度器任务基础结构是很灵活的,其中TaskScheduler对象功不可没,TaskScheduler对象负责执行调度的任务,同时向Visual Studio调试器公开任务信息。FCL提供了两个派生自TaskScheduler的类型:线程池任务调度器(thread pool task scheduler)和同步上下文任务调度器(synchronization context t原创 2012-02-14 13:03:54 · 363 阅读 · 0 评论 -
第26章 计算限制的异步操作(7)
26.5.4 任务可以启动子任务using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ class Program { static void Main(string[] args) { Tas原创 2012-02-13 10:46:32 · 399 阅读 · 0 评论 -
第26章 计算限制的异步操作(6)
26.5.3 一个任务完成时自动启动一个新任务using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ class Program { static void Main(string[] args) {原创 2012-02-13 10:19:34 · 456 阅读 · 0 评论 -
第26章 计算限制的异步操作(5)
26.5.2 取消任务using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ class Program { static void Main(string[] args) { Cancel原创 2012-02-10 16:53:55 · 419 阅读 · 0 评论 -
第26章 计算限制的异步操作(5)
26.5.2 取消任务using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ class Program { static void Main(string[] args) { Cancella2012-02-10 16:36:49 · 136 阅读 · 0 评论 -
第26章 计算限制的异步操作(4)
26.5 任务调用ThreadPool的QueueUserWorkItem方法发起一次异步的、受计算限制的操作时非常简单的。然而,这个技术存在很多限制。最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成时获得一个返回值。为了克服这些限制(并解决其他一些问题),Microsoft引入了任务(task)的概念。我们通过System.Threading.Tasks命名原创 2012-02-10 15:26:26 · 498 阅读 · 0 评论 -
第26章 计算限制的异步操作(3)
26.4 协作式取消Microsoft .NET Framework提供了一个标准的取消操作模式。这个模式是协作式的,意味着你想取消的操作必须显式地支持取消。对于长时间运行的计算限制操作来说,支持取消是一件很“棒”的事情。所以,你应该考虑为自己的计算限制操作添加取消能力。System.Threading.CancellationTokenStore对象包含了和管理取消有关的所有状态。构造好原创 2012-02-10 14:55:02 · 614 阅读 · 0 评论 -
第26章 计算限制的异步操作(2)
26.3 执行上下文每个线程都关联了一个上下文数据结构。执行上下文(execution context)包括的东西有安全设置、宿主设置以及逻辑调用上下文数据。理想情况下,每当一个线程(初始线程)使用另一个线程(辅助线程)执行任务时,前者的执行上下文应该流向(复制到)辅助线程。这就确保了辅助线程执行的任何操作使用的是相同的安全设置和宿主设置。还确保了初始线程的逻辑调用上下文可以在辅助线程中使原创 2012-02-10 13:50:26 · 381 阅读 · 0 评论 -
第26章 计算限制的异步操作(1)
26.1 CLR线程池基础可将线程池想象成可由你的应用程序使用的一个线程集合。每CLR一个线程池,每个线程由CLR控制的所有AppDomain共享。如果一个进程中加载了多个CLR,那么每个CLR都有它自己的线程池。CLR初始化时,线程池中没有线程的。在内部,线程池维护了一个操作请求队列。应用程序想执行一个异步操作时,就调用某个方法,将一个记录项(entry)追加到线程池的队列中。线程池的代原创 2012-02-10 10:41:39 · 487 阅读 · 0 评论 -
第25章 线程处理(4)
25.8 使用线程的理由三个方面的理由:可以使用线程将代码同其他代码隔离 由于你的应用程序对健壮性的要求没有操作系统对健壮性的要求高,所以你的应用程序不应出于维持健壮性的目的而使用太多的线程。如果你的应用程序支持加载由其他厂商生成的组件,那么应用程序对健壮性的要求就会提高,使用线程有助于满足这个需求。可以使用线程来简化编码 有的时候,如果通过一个任务自己的线程来执行该任务,编码会变原创 2012-02-09 15:06:27 · 397 阅读 · 0 评论 -
第25章 线程处理(2)
25.3 停止疯狂如果唯一关心的就是原始性能,那么任何机器上最优的线程数就是那台机器的CPU的数目。在Windows中,一个进程是十分“昂贵”的。创建一个进程通常要花几秒钟的时间,必须分配大量内存,这些内存必须初始化,exe和dll文件必须从磁盘上加载。今天系统中的大多数线程都是由本地(native)代码创建的。所以,线程的用户模式栈仅仅是保留(预订)地址空间,而且栈极有可能并没有完全原创 2012-02-09 10:31:18 · 403 阅读 · 0 评论 -
第25章 线程处理(5)
25.10 前台线程和后台线程CLR将每个线程要么视为前台线程,要么视为后台线程。一个进程中的所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程。这些后台线程被直接终止;不会抛出异常。前台线程应该用于执行确实想完成的任务,应该为非关键的任务使用后台线程。CLR要提供前台线程和后台线程的概念更好地支持AppDomain。每个AppDomain都可以运行一个单独的应用程序。每个应原创 2012-02-09 16:10:07 · 374 阅读 · 0 评论 -
第25章 线程处理(1)
25.1 Windows为什么要支持线程进程:Microsoft设计Windows NT内核时,它们决定在一个进程(process)中进行应用程序的每个实例。进程不过是应用程序的一个实例要使用的资源的一个集合。1. 每个进程都被赋予了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进程访问。这就确保了应用程序的实例的健壮性,因为一个进程无法破坏另一个进程使用的代码或数据。(进原创 2012-02-08 16:17:15 · 441 阅读 · 0 评论 -
第26章 计算限制的异步操作(10)
26.6 Parallel的静态For,ForEach和Invoke方法using System;using System.Threading;using System.Threading.Tasks;namespace ThreadStudy{ public class Program { static void Main(string[] ar原创 2012-02-14 16:33:11 · 352 阅读 · 0 评论