C#3.0核心技术-第19章线程-全新翻译注释-19.2(1)

来源:互联网 发布:数据库测试用例怎么写 编辑:程序博客网 时间:2024/04/30 12:37

19.2 入门

一个C#程序从一个由CLR和操作系统自动创建的单一线程(“主”线程)启动。这里它以一个单线程应用渡过它的生命,除非你做其它事情,通过创建更多的线程(直接或间接地)。

创建一个线程最简单的方式是实例化一个Thread对象并调用它的Start方法。Thread的构造方法以一个ThreadStart委托(作为参数):一个无参的方法指示执行从哪里开始。这是一个例子:

clip_image001

原文注:

所有的例子假定下列命名空间被引入,除非另外指定:

using System;

using System.Threading;

主线程创建了一个新线程t,这个线程运行一个重复打印字符“y”的方法。同时,主线程重复地打印字符“x”,如图19-1所示。在一个单处理器计算机上,操作系统必须分配时间的“切片”给每一个线程(在Windows中典型的为20ms)以仿真并发,导致重复的“x”和“y”的块。在一个多处理器或者多核机器当中,两个线程可以真正地并行执行,尽管你仍旧得到重复的“x”和“y”的块,因为Console处理并发请求的微妙机制。

clip_image002

原文注:

一个线程的执行在一些点上被另外一个线程上执行的代码穿插,第一个线程就被说成是被占先。这个术语经常出现在解释为什么一些事情出现错误!

一旦开始,一个线程的IsAlive属性返回true,直到线程终止的那一点。一个线程在当被线程的构造函数引用的方法—在这个例子中是WriteY—(译者注:执行)完成时终止。一旦终止,线程不能够再重新开始。

你可以通过调用(译者注:一个线程)的Join方法等待另一个线程结束。这里是例子:

clip_image003

这打印“y”1000次,直接跟随“Thread t has ended!”。当调用Join时你可以包括一个超时,要么以毫秒形式要么以TimeSpan形式。它(译者注:指Join)然后返回true,如果线程终止,或者返回false,如果超时发生。

Thread.Sleep以一个指定时期暂停当前线程:

clip_image004

Thread.Sleep(0)放弃处理器足够长时间以允许任何其他在时间片队列(这里应当有一个)的活动线程被执行。

原文注:

Thread.Sleep(0)在为高级性能调整的生产法则时偶尔有用。它也是一个帮助发现线程安全问题的很棒的诊断工具:如果在你的代码的任意位置插入Thread.Sleep(0)使得程序不成则败(译者注:指插不插入Thread.Sleep(0)会导致程序从不可以正常运行到可以正常运行,或者从可以正常运行到不可以正常运行),你几乎必定有一个bug。

每个线程有一个Name属性,你可以设置它以为调试提供便利。这在Microsoft Visual Studio中尤其有用,因为线程的名字被显示在Debug Location工具条中。你可以仅仅设置线程的名字一次;试图在(译者注:第一次设置的)后面改变它将抛出一个异常。

静态Thread.CurrentThread属性允许你引用当前正在执行的线程:

clip_image005