100165452.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 171 行 · 第 1/2 页
HTM
171 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">该代码段从类的声明开始,</span><span lang="EN-US">interval</span><span style="FONT-FAMILY: 宋体">是这个类的一个静态字段。在</span><span lang="EN-US">Main()</span><span style="FONT-FAMILY: 宋体">方法中,首先要求用户输入</span><span lang="EN-US">interval</span><span style="FONT-FAMILY: 宋体">的值。然后获取表示主线程的线程对象引用,这样,就可以给线程指定名称,并可以在结果中看到具体的执行情况。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">接着,创建工作线程,设置它的名称,启动它,给它传送一个委托,指定它必须从方法</span><span lang="EN-US">WorkerStart</span><span style="FONT-FAMILY: 宋体">开始执行,最后调用</span><span lang="EN-US">DisplayNumbers()</span><span style="FONT-FAMILY: 宋体">方法,开始累加。工作线程的入口是:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> static void StartMethod()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> DisplayNumbers();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("Worker Thread Finished");</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">注意所有这些方法都是类</span><span lang="EN-US">EntryPoint</span><span style="FONT-FAMILY: 宋体">的静态方法。两个累加过程是完全独立的,因为</span><span lang="EN-US">DisplayNumbers()</span><span style="FONT-FAMILY: 宋体">方法中用于累加数字的变量</span><span lang="EN-US">i </span><span style="FONT-FAMILY: 宋体">是一个局部变量。局部变量只能在定义它们的方法中使用,也只有在执行该方法的线程中是可见的。如果另一个线程开始执行这个方法,该线程就会获得该局部变量的副本。运行这段代码,给</span><span lang="EN-US">interval</span><span style="FONT-FAMILY: 宋体">选择一个相对小的值</span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体">,得到如下结果:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><strong><span lang="EN-US">ThreadPlayaround</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Interval to display results at?> <strong>100</strong></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Starting thread: Main Thread</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: Current Culture = en-US</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 100</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 200</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 300</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 400</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 500</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 600</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 700</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 800</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread Finished</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Starting thread: Worker</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: Current Culture = en-US</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 100</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 200</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 300</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 400</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 500</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 600</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 700</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 800</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Worker Thread Finished</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">对于并行的线程而言,两个线程的执行都非常成功。主线程启动后,累加到</span><span lang="EN-US">800</span><span style="FONT-FAMILY: 宋体">之后完成执行,然后启动工作线程,执行累加过程。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">此处的问题是启动线程是一个主进程,在实例化一个新线程后,主线程会遇到下面的代码:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> workerThread.Start();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">它调用</span><span lang="EN-US">Thread.Start()</span><span style="FONT-FAMILY: 宋体">,告诉</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">新线程已经准备启动,然后即时返回。在累加到</span><span lang="EN-US">800</span><span style="FONT-FAMILY: 宋体">时,</span><span lang="EN-US">Windows</span><span style="FONT-FAMILY: 宋体">就启动新线程,这意味着给该线程分配各种资源,执行各种安全检查。到新线程启动时,主线程已经完成了任务。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">解决这个问题的方式是选择一个比较大的</span><span lang="EN-US"> interval</span><span style="FONT-FAMILY: 宋体">,这样,两个线程在</span><span lang="EN-US">DisplayNumbers()</span><span style="FONT-FAMILY: 宋体">方法中花费的时间会比较长,这次给</span><span lang="EN-US">interval</span><span style="FONT-FAMILY: 宋体">输入</span><span lang="EN-US">1000000</span><span style="FONT-FAMILY: 宋体">,得到如下所示的结果:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><strong><span lang="EN-US">ThreadPlayaround</span></strong></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Interval to display results at?> <strong>1000000</strong></span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Starting thread: Main Thread</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: Current Culture = en-US</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 1000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Starting thread: Worker</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: Current Culture = en-US</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 2000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 1000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 3000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 2000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 4000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 3000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 5000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 6000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 4000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 7000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 5000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread: count has reached 8000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Main Thread Finished</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 6000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 7000000</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Worker: count has reached 8000000</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">Worker Thread Finished</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">现在就可以看出,这两个线程实际上是并行工作的。主线程启动,累加到</span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体">万,当主线程计算下一个</span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体">万时,工作线程启动,从那时起,两个线程以相同的速度累加,直到完成任务为止。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">除非运行一个多处理器计算机,否则在</span><span lang="EN-US">CPU</span><span style="FONT-FAMILY: 宋体">密集的任务中使用两个线程不能节省多少时间,理解这一点是很重要的。在单处理器计算机上,让两个线程都累加到</span><span lang="EN-US">800</span><span style="FONT-FAMILY: 宋体">万所花的时间与让一个线程累加到</span><span lang="EN-US">1600</span><span style="FONT-FAMILY: 宋体">万是相同的,甚至使用两个线程所用的时间会略长,因为要处理另一个线程,操作系统必须用一定的时间切换线程,但这种区别可以忽略不计。使用多个线程的优点有两个。首先,可以作出响应,因为一个线程在处理用户输入时,另一个线程在后台完成其他工作;第二,如果一个或多个线程所处理的工作不占用</span><span lang="EN-US">CPU</span><span style="FONT-FAMILY: 宋体">时间</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">例如,等待从</span><span lang="EN-US">Internet</span><span style="FONT-FAMILY: 宋体">中获取数据</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,就可以节省时间,因为其他线程可以在未激活的线程处于等待状态时执行它们的任务。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165451.htm">上一页</a> <a href="index.html">首页</a> <a href="100165453.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165452.htm'><font color='red'>15.4 ThreadPlayaround示例</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165449.htm'>15.1 线程</a></div><div style='float:right;width:49%'>·<a href='100165450.htm'>15.2 多线程应用程序</a></div><div style='float:left;width:49%'>·<a href='100165451.htm'>15.3 线程的处理</a></div><div style='float:right;width:49%'>·<a href='100165453.htm'>15.5 线程的优先级</a></div><div style='float:left;width:49%'>·<a href='100165454.htm'>15.6 同步</a></div><div style='float:right;width:49%'>·<a href='100165455.htm'>15.6.1 同步的含义</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?