﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-老刘忙不忙</title><link>http://www.cnblogs.com/xd125/</link><description>很忙</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 02:21:45 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 02:21:45 GMT</pubDate><ttl>60</ttl><item><title>c# 线程同步： 详解lock,monitor,同步事件和等待句柄以及mutex</title><link>http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html</link><dc:creator>老刘很氓</dc:creator><author>老刘很氓</author><pubDate>Wed, 12 Dec 2007 08:44:00 GMT</pubDate><guid>http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html</guid><description><![CDATA[<p>阅读: 10070 评论: 34 作者: <a href="http://www.cnblogs.com/xd125/" target="_blank">老刘很氓</a> 发表于 2007-12-12 16:44 <a href="http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;&nbsp; <span lang="ZH-CN">最近由于在准备</span><span lang="EN-US">Collection</span><span lang="ZH-CN">对象培训的</span><span lang="EN-US">PPT</span><span lang="ZH-CN">，因为涉及到</span><span lang="EN-US">SyncRoot</span><span lang="ZH-CN">的属性的讲解，所以对怎样在多线程应用程序中同步资源访</span><span lang="ZH-CN">问</span><span lang="ZH-CN">做了个总结：<br />
</span><span lang="ZH-CN">对于引用类型和非线程安全的资源的同步处理，有四种相关处理：</span><span lang="EN-US">lock</span><span lang="ZH-CN">关键字，监视器</span><span lang="EN-US">(</span><span lang="EN-US">Monitor</span><span lang="EN-US">),</span><span lang="EN-US"> </span><span lang="ZH-CN">同</span><span lang="ZH-CN">步</span><span lang="ZH-CN">事件和等待句</span><span lang="ZH-CN">柄</span><span lang="ZH-CN">，</span><span lang="ZH-CN"> </span><span lang="EN-US">mutex</span><span lang="ZH-CN">类。</span> <br />
<span lang="EN-US" style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Lock</span><span lang="ZH-CN" style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">关键字</span><br />
<span style="font-size: 10pt; color: black; font-family: SimSun">&nbsp;&nbsp;&nbsp; 本人愚钝</span><span style="font-family: SimSun">，在以前编程中遇到</span>lock<span style="font-family: SimSun">的问题总是使用</span>lock(this)<span style="font-family: SimSun">一锁了之，出问题后翻看</span>MSDN<span style="font-family: SimSun">突然发现下面几行字：</span><span style="font-family: 'ＭＳ 明朝'">通常，</span><span style="font-family: SimSun">应</span><span style="font-family: 'ＭＳ 明朝'">避免</span><span style="font-family: SimSun">锁</span><span style="font-family: 'ＭＳ 明朝'">定</span> public <span style="font-family: SimSun">类</span><span style="font-family: 'ＭＳ 明朝'">型，否</span><span style="font-family: SimSun">则实</span><span style="font-family: 'ＭＳ 明朝'">例将超出代</span><span style="font-family: SimSun">码</span><span style="font-family: 'ＭＳ 明朝'">的控制范</span><span style="font-family: SimSun">围</span><span style="font-family: 'ＭＳ 明朝'">。常</span><span style="font-family: SimSun">见</span><span style="font-family: 'ＭＳ 明朝'">的</span><span style="font-family: SimSun">结</span><span style="font-family: 'ＭＳ 明朝'">构</span> lock (this)<span style="font-family: 'ＭＳ 明朝'">、</span>lock (typeof (MyType)) <span style="font-family: 'ＭＳ 明朝'">和</span> lock ("myLock") <span style="font-family: SimSun">违</span><span style="font-family: 'ＭＳ 明朝'">反此准</span><span style="font-family: SimSun">则</span><span style="font-family: 'ＭＳ 明朝'">：</span><span style="font-family: 'ＭＳ 明朝'">如果</span><span style="font-family: SimSun">实</span><span style="font-family: 'ＭＳ 明朝'">例可以被公共</span><span style="font-family: SimSun">访问</span><span style="font-family: 'ＭＳ 明朝'">，将出</span><span style="font-family: SimSun">现</span> lock (this) <span style="font-family: SimSun">问题</span><span style="font-family: 'ＭＳ 明朝'">。</span><span style="font-family: 'ＭＳ 明朝'">如果</span> MyType <span style="font-family: 'ＭＳ 明朝'">可以被公共</span><span style="font-family: SimSun">访问</span><span style="font-family: 'ＭＳ 明朝'">，将出</span><span style="font-family: SimSun">现</span> lock (typeof (MyType)) <span style="font-family: SimSun">问题</span><span style="font-family: 'ＭＳ 明朝'">。</span><span style="font-family: 'ＭＳ 明朝'">由于</span><span style="font-family: SimSun">进</span><span style="font-family: 'ＭＳ 明朝'">程中使用同一字符串的任何其他代</span><span style="font-family: SimSun">码</span><span style="font-family: 'ＭＳ 明朝'">将共享同一个</span><span style="font-family: SimSun">锁</span><span style="font-family: 'ＭＳ 明朝'">，所以出</span><span style="font-family: SimSun">现</span> lock(&#8220;myLock&#8221;) <span style="font-family: SimSun">问题。</span><span style="font-family: 'ＭＳ 明朝'">来</span><span style="font-family: SimSun">看</span><span style="font-family: 'ＭＳ 明朝'">看</span>lock(this)<span style="font-family: 'ＭＳ 明朝'">的</span><span style="font-family: SimSun">问题</span>:<span style="font-family: SimSun">如果有一个类</span>Class1<span style="font-family: SimSun">，该类有一个方法用</span>lock(this)<span style="font-family: SimSun">来实现互斥：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Method2()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Windows.Forms.MessageBox.Show(</span><span style="color: #000000">"</span><span style="color: #000000">Method2&nbsp;End</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp; 如果在同一个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Class1</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">的实例中</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">,</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">该</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Method2</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">能够互斥的执行。但是如果是</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">2</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">个</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Class1</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">的实例分别来执行</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Method2,</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">是没有互斥效果的。因为这里的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock,</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">只是对当前的实例对象进行了加锁。</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><br />
&nbsp;&nbsp;&nbsp; Lock(typeof(MyType))<span style="font-family: SimSun">锁定住的对象范围更为广泛，由于一个类的所有实例都只有一个类型对象（该对象是</span>typeof<span style="font-family: SimSun">的返回结果），锁定它，就锁定了该对象的所有实例，微软现在建议（原文请参考：</span><span style="font-size: 10.5pt; font-family: Century"><a href="http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/SDaskgui06032003.mspx?mfr=true">http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/SDaskgui06032003.mspx?mfr=true</a></span><span style="font-size: 10.5pt; font-family: SimSun">）不要使用</span><span style="font-size: 10.5pt; font-family: Century">lock(typeof(MyType)),</span><span style="font-size: 10.5pt; font-family: SimSun">因为锁定类型对象是个很缓慢的过程，并且类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象，因此，它们就有可能代替您锁定类型对象，完全阻止您的执行，从而导致你自己的代码的挂起。<br />
</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp; 锁住一个字符串更为神奇，只要字符串内容相同，就能引起程序挂起。原因是在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">.NET</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">中，字符串会被暂时存放，如果两个变量的字符串内容相同的话，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">.NET</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">会把暂存的字符串对象分配给该变量。所以如果有两个地方都在使用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock(&#8220;my lock&#8221;)</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">的话，它们实际锁住的是同一个对象。</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><span style="font-family: SimSun">到此，微软给出了个</span>lock<span style="font-family: SimSun">的建议用法：锁定一个私有的</span>static <span style="font-family: SimSun">成员变量。</span><br />
<span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .NET</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">在一些集合类中（比如</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">ArrayList,HashTable</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Queue</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Stack</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">）已经提供了一个供</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">使用的对象</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Collections.ArrayList/property:SyncRoot:Object"><span style="color: windowtext; text-decoration: none; text-underline: none">SyncRoot</span></a></span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Reflector</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">工具查看了</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">SyncRoot</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">属性的代码，在</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Array</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">中，该属性只有一句话</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">:return this,</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">这样和</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock array</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">的当前实例是一样的。</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">ArrayList</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">中的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">SyncRoot</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">有所不同</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">._syncRoot&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Interlocked.CompareExchange(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._syncRoot,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">(),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._syncRoot;<br />
</span></div>
</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">&nbsp;&nbsp; 其中</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><a title="System.Threading.Interlocked" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Threading.Interlocked"><span style="color: windowtext; text-decoration: none; text-underline: none">Interlocked</span></a></span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">类是专门为多个线程共享的变量提供原子操作（如果你想锁定的对象是基本数据类型，那么请使用这个类），</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">CompareExchange</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">方法将当前</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">syncRoot</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">和</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">null</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">做比较，如果相等，就替换成</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">new object()</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，这样做是为了保证多个线程在使用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">syncRoot</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">时是线程安全的。集合类中还有一个方法是和同步相关的：</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Synchronized</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，该方法返回一个对应的集合类的</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">wrapper</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">类，该类是线程安全的，因为他的大部分方法都用</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">来进行了同步处理，比如</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Add</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">方法：</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;key,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;value)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">._table.SyncRoot)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._table.Add(key,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN">&nbsp;&nbsp;&nbsp; 这里要特别注意的是</span><span lang="EN-US" style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun">MSDN</span><span lang="ZH-CN" style="font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN">提到：从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。即使一个集合已进行同步，其他线程仍可以修改该集合，这将导致枚举数引发异常。若要在枚举过程中保证线程安全，可以在整个枚举过程中锁定集合：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">Queue&nbsp;myCollection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Queue();<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">(myCollection.SyncRoot)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Object&nbsp;item&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;myCollection)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Insert&nbsp;your&nbsp;code&nbsp;here.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;}<br />
&nbsp;}<br />
</span></div>
</span><span lang="EN-US" style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"><o:p><span lang="EN-US" style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Monitor</span><span lang="ZH-CN" style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">类<br />
<span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">该类功效和</span><span lang="EN-US" style="font-size: 10.5pt; font-family: Century; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">lock</span><span lang="ZH-CN" style="font-size: 10.5pt; font-family: SimSun; mso-ascii-font-family: Century; mso-hansi-font-family: Century; mso-fareast-language: ZH-CN; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">类似：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">System.Object&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(System.Object)x;<br />
System.Threading.Monitor.Enter(obj);<br />
</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;DoSomething();<br />
}<br />
</span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.Threading.Monitor.Exit(obj);<br />
}<br />
</span></div>
</span></span></o:p></span></span></span></span></span>&nbsp;&nbsp;&nbsp; lock<span style="font-family: SimSun">关键字比</span>Monitor<span style="font-family: SimSun">简洁，其实</span>lock<span style="font-family: SimSun">就是对</span>Monitor<span style="font-family: SimSun">的</span>Enter<span style="font-family: SimSun">和</span>Exit<span style="font-family: SimSun">的一个封装。另外</span>Monitor<span style="font-family: SimSun">还有几个常用的方法：</span>TryEnter<span style="font-family: SimSun">能够有效的决绝长期死等的问题，如果在一个并发经常发生，而且持续时间长的环境中使用</span>TryEnter<span style="font-family: SimSun">，可以有效防止死锁或者长时间的等待。比如我们可以设置一个等待时间</span>bool gotLock = Monitor.TryEnter<span style="font-family: SimSun">（</span>myobject,1000<span style="font-family: SimSun">）</span>,<span style="font-family: SimSun">让当前线程在等待</span>1000<span style="font-family: SimSun">秒后根据返回的</span>bool<span style="font-family: SimSun">值来决定是否继续下面的操作。Pulse以及PulseAll还有Wait方法是成对使用的，它们能让你更精确的控制线程之间的并发,MSDN关于这3个方法的解释很含糊，有必要用一个具体的例子来说明一下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Threading;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;ball&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;threadPing&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(&nbsp;ThreadPingProc&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;threadPong&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(&nbsp;ThreadPongProc&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadPing.Start();&nbsp;threadPong.Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadPongProc()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPong:&nbsp;Hello!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">&nbsp;(&nbsp;ball&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPong:&nbsp;Pong&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor.Pulse(&nbsp;ball&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor.Wait(&nbsp;ball&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPong:&nbsp;Bye!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ThreadPingProc()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPing:&nbsp;Hello!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">&nbsp;(&nbsp;ball&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPing:&nbsp;Ping&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor.Pulse(&nbsp;ball&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Monitor.Wait(&nbsp;ball&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">ThreadPing:&nbsp;Bye!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
&nbsp;&nbsp; 执行结果如下(有可能是ThreadPong先执行)：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ThreadPing:&nbsp;Hello</span><span style="color: #000000">!</span><span style="color: #000000"><br />
ThreadPing:&nbsp;Ping<br />
ThreadPong:&nbsp;Hello</span><span style="color: #000000">!</span><span style="color: #000000"><br />
ThreadPong:&nbsp;Pong<br />
ThreadPing:&nbsp;Ping<br />
ThreadPong:&nbsp;Pong<br />
ThreadPing:&nbsp;Ping<br />
ThreadPong:&nbsp;Pong<br />
ThreadPing:&nbsp;Ping<br />
ThreadPong:&nbsp;Pong<br />
ThreadPing:&nbsp;Ping<br />
ThreadPong:&nbsp;Pong<br />
ThreadPing:&nbsp;Bye</span><span style="color: #000000">!</span><span style="color: #000000"><br />
</span></div>
</span>&nbsp;&nbsp; 当threadPing进程进入ThreadPingProc锁定ball并调用Monitor.Pulse( ball );后，它通知threadPong从阻塞队列进入准备队列，当threadPing调用Monitor.Wait( ball )阻塞自己后，它放弃了了对ball的锁定，所以threadPong得以执行。PulseAll与Pulse方法类似，不过它是向所有在阻塞队列中的进程发送通知信号，如果只有一个线程被阻塞，那么请使用Pulse方法。<br />
<span style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'">同步事件和等待句柄<br />
</span>&nbsp;&nbsp; 同步事件和等待句柄用于解决更复杂的同步情况，比如一个一个大的计算步骤包含3个步骤result = first term + second term + third term,如果现在想写个多线程程序，同时计算first term,second term 和third term，等所有3个步骤计算好后再把它们汇总起来，我们就需要使用到同步事件和等待句柄，同步事件分有两个，分别为AutoResetEvent和ManualResetEvent，这两个类可以用来代表某个线程的运行状态：终止和非终止，等待句柄用来判断ResetEvent的状态，如果是非终止状态就一直等待，否则放行，让等待句柄下面的代码继续运行。下面的代码示例阐释了如何使用等待句柄来发送复杂数字计算的不同阶段的完成信号。此计算的格式为：result = first term + second term + third term
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Threading;<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CalculateTest<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calculate&nbsp;calc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Calculate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">Result&nbsp;=&nbsp;{0}.</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calc.Result(</span><span style="color: #000000">234</span><span style="color: #000000">).ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">Result&nbsp;=&nbsp;{0}.</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calc.Result(</span><span style="color: #000000">55</span><span style="color: #000000">).ToString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Calculate<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;baseNumber,&nbsp;firstTerm,&nbsp;secondTerm,&nbsp;thirdTerm;<br />
&nbsp;&nbsp;&nbsp;&nbsp;AutoResetEvent[]&nbsp;autoEvents;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ManualResetEvent&nbsp;manualEvent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Generate&nbsp;random&nbsp;numbers&nbsp;to&nbsp;simulate&nbsp;the&nbsp;actual&nbsp;calculations.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;randomGenerator;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Calculate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoEvents&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AutoResetEvent[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AutoResetEvent(</span><span style="color: #0000ff">false</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AutoResetEvent(</span><span style="color: #0000ff">false</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AutoResetEvent(</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ManualResetEvent(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CalculateBase(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;stateInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;randomGenerator.NextDouble();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Signal&nbsp;that&nbsp;baseNumber&nbsp;is&nbsp;ready.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent.Set();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;The&nbsp;following&nbsp;CalculateX&nbsp;methods&nbsp;all&nbsp;perform&nbsp;the&nbsp;same<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;series&nbsp;of&nbsp;steps&nbsp;as&nbsp;commented&nbsp;in&nbsp;CalculateFirstTerm.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CalculateFirstTerm(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;stateInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Perform&nbsp;a&nbsp;precalculation.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Wait&nbsp;for&nbsp;baseNumber&nbsp;to&nbsp;be&nbsp;calculated.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent.WaitOne();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Calculate&nbsp;the&nbsp;first&nbsp;term&nbsp;from&nbsp;preCalc&nbsp;and&nbsp;baseNumber.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstTerm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;baseNumber&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Signal&nbsp;that&nbsp;the&nbsp;calculation&nbsp;is&nbsp;finished.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoEvents[</span><span style="color: #000000">0</span><span style="color: #000000">].Set();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CalculateSecondTerm(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;stateInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent.WaitOne();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secondTerm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;baseNumber&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoEvents[</span><span style="color: #000000">1</span><span style="color: #000000">].Set();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CalculateThirdTerm(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;stateInfo)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent.WaitOne();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thirdTerm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;preCalc&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;baseNumber&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomGenerator.NextDouble();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoEvents[</span><span style="color: #000000">2</span><span style="color: #000000">].Set();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;Result(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;seed)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomGenerator&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Random(seed);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Simultaneously&nbsp;calculate&nbsp;the&nbsp;terms.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPool.QueueUserWorkItem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WaitCallback(CalculateBase));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPool.QueueUserWorkItem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WaitCallback(CalculateFirstTerm));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPool.QueueUserWorkItem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WaitCallback(CalculateSecondTerm));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadPool.QueueUserWorkItem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WaitCallback(CalculateThirdTerm));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Wait&nbsp;for&nbsp;all&nbsp;of&nbsp;the&nbsp;terms&nbsp;to&nbsp;be&nbsp;calculated.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WaitHandle.WaitAll(autoEvents);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Reset&nbsp;the&nbsp;wait&nbsp;handle&nbsp;for&nbsp;the&nbsp;next&nbsp;calculation.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manualEvent.Reset();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;firstTerm&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;secondTerm&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;thirdTerm;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
&nbsp;&nbsp; 该示例一共有4个ResetEvent，一个ManualEvent，三个AutoResetEvent,分别反映4个线程的运行状态。ManualEvent和AutoResetEvent有一点不同：AutoResetEvent是在当前线程调用set方法激活某线程之后，AutoResetEvent状态自动重置，而ManualEvent则需要手动调用Reset方法来重置状态。接着来看看上面那段代码的执行顺序，Main方法首先调用的是Result 方法，Result方法开启4个线程分别去执行，主线程阻塞在WaitHandle.WaitAll(autoEvents)处，等待3个计算步骤的完成。4个ResetEvent初始化状态都是非终止(构造实例时传入了false)，CalculateBase首先执行完毕，其他3个线程阻塞在manualEvent.WaitOne()处，等待CalculateBase执行完成。CalculateBase生成baseNumber后，把代表自己的ManualEvent状态设置为终止状态。其他几个线程从manualEvent.WaitOne()处恢复执行，在执行完自己的代码后把自己对应的AutoResetEvent状态置为终止。当3个计算步骤执行完后，主线程从阻塞中恢复，把三个计算结果累加后返回。还要多补充一点的是WaitHandle的WaitOne,WaitAll,WaitAny方法，如果等待多个进程就用WaitAll,如本例中的：WaitHandle.WaitAll(autoEvents)，WaitAny是等待的线程中有一个结束则停止等待。<br />
<span style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'">Mutex </span><span style="font-size: 14pt; color: black; font-family: 'Arial Unicode MS'">对象<br />
</span>&nbsp;&nbsp;&nbsp; Mutex与Monitor类似，这里不再累赘，需要注意的是Mutex分两种：一种是本地Mutex一种是系统级Mutex，系统级Mutex可以用来进行跨进程间的线程的同步。尽管 mutex 可以用于进程内的线程同步，但是使用 Monitor 通常更为可取，因为监视器是专门为 .NET Framework 而设计的，因而它可以更好地利用资源。相比之下，Mutex 类是 Win32 构造的包装。尽管 mutex 比监视器更为强大，但是相对于 Monitor 类，它所需要的互操作转换更消耗计算资源。<br />
<span style="font-size: 10pt; color: black; font-family: 'Arial Unicode MS'">注：文中代码示例来源于</span><span style="font-size: 10pt; color: black; font-family: 'Arial Unicode MS'">MSDN</span><span style="font-size: 10pt; color: black; font-family: 'Arial Unicode MS'">和</span><span style="font-size: 10pt; color: black; font-family: 'Arial Unicode MS'">CodeProject</span> 
<img src="http://www.cnblogs.com/xd125/aggbug/992406.html?type=1" width="1" height="1" alt=""/><p>评论: 34　<a href="http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56803/" target="_blank">Yahoo 对 Google Buzz 的挑衅很不满：我们两年前就 Buzz 上了</a><span style="color:gray">(2010-02-10 10:19)</span><br/>· <a href="http://news.cnblogs.com/n/56802/" target="_blank">Google Buzz 第一时间上手体验，twitter + Facebook + Foursquare？</a><span style="color:gray">(2010-02-10 10:17)</span><br/>· <a href="http://news.cnblogs.com/n/56801/" target="_blank">微软发布13个安全补丁 平最高纪录</a><span style="color:gray">(2010-02-10 10:03)</span><br/>· <a href="http://news.cnblogs.com/n/56800/" target="_blank">Windows 7下MSN无法启动或报错解决方法</a><span style="color:gray">(2010-02-10 10:00)</span><br/>· <a href="http://news.cnblogs.com/n/56799/" target="_blank">百度第四季度净利润6270万美元 同比增48.2%</a><span style="color:gray">(2010-02-10 09:10)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>在DataAdapter中开启事务</title><link>http://www.cnblogs.com/xd125/archive/2007/11/23/969970.html</link><dc:creator>老刘很氓</dc:creator><author>老刘很氓</author><pubDate>Fri, 23 Nov 2007 07:07:00 GMT</pubDate><guid>http://www.cnblogs.com/xd125/archive/2007/11/23/969970.html</guid><description><![CDATA[<p>阅读: 2131 评论: 19 作者: <a href="http://www.cnblogs.com/xd125/" target="_blank">老刘很氓</a> 发表于 2007-11-23 15:07 <a href="http://www.cnblogs.com/xd125/archive/2007/11/23/969970.html" target="_blank">原文链接</a></p>&nbsp;&nbsp; <span style="font-family: 宋体">在</span>ADO.NET 2.0<span style="font-family: 宋体">中引入了strong typed </span>table adapter,强化了strong typed dataset的设计视图，<span style="font-family: 宋体">使用非常方便，但是在实际运用当中，还是遇到了一些麻烦，比如怎么在多个</span>table adapter<span style="font-family: 宋体">之间开启事务，由于</span>table adapter<span style="font-family: 宋体">自身没有提供事务功能，而且它的</span>connection<span style="font-family: 宋体">对象默认是</span>private<span style="font-family: 宋体">，所以要实现事务稍微有些麻烦，目前的解决方法大概如下几种</span><span style="font-size: 10.5pt; font-family: 宋体">最简单的一个方法就是使用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">transaction scope,</span><span style="font-size: 10.5pt; font-family: 宋体">如下：
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">using</span><span style="color: rgb(0,0,0)">&nbsp;(TransactionScope&nbsp;ts&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;TransactionScope())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">do&nbsp;something&nbsp;here</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.Complete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</span><span style="font-size: 10.5pt; font-family: 宋体">但该方法有个缺点，需要开启135端口，还要配置</span><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'">MS DTC</span><span style="font-size: 10.5pt; font-family: 宋体">，在某些不能随便开启端口的环境下就不能使用该方法。<br />
&nbsp; <span style="font-family: 宋体">方法二：将</span><span lang="EN-US">connection</span><span style="font-family: 宋体">的</span><span lang="EN-US">modifier</span><span style="font-family: 宋体">属性改为</span><span lang="EN-US">public,</span><span style="font-family: 宋体">然后操作</span><span lang="EN-US">connection,如下：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">SqlConnection&nbsp;connection&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;table1TableAdapter.Connection;&nbsp;<br />
table2TableAdapter.Connection&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;connection;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Start&nbsp;a&nbsp;local&nbsp;Transaction&nbsp;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">SqlTransaction&nbsp;transaction&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;connection.BeginTransaction();&nbsp;<br />
table1TableAdapter.MyAdapter.InsertCommand.Transaction&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;transaction;&nbsp;<br />
table2TableAdapter.MyAdapter.InsertCommand.Transaction&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;transaction;&nbsp;<br />
</span><span style="color: rgb(0,0,255)">try</span><span style="color: rgb(0,0,0)">&nbsp;<br />
{&nbsp;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Update&nbsp;Database&nbsp;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">table1TableAdapter.Update(dataSet1.Table1);&nbsp;<br />
table2TableAdapter.Update(dataSet1.Table2);&nbsp;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Commit&nbsp;Changes&nbsp;to&nbsp;database&nbsp;</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">transaction.Commit();&nbsp;<br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">more&nbsp;code&nbsp;here<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span></div>
<span style="font-size: 10.5pt; font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp; 方法三：利用</span><span lang="EN-US">System.Reflection</span><span style="font-family: 宋体">命名空间下的</span><span lang="EN-US">PropertyInfo</span><span style="font-family: 宋体">类的</span><span lang="EN-US">GetProperty</span><span style="font-family: 宋体">方法取得</span><span lang="EN-US">table adapter</span><span style="font-family: 宋体">的私有</span><span lang="EN-US">connection</span><span style="font-family: 宋体">属性，附加上</span><span lang="EN-US">transaction</span><span style="font-family: 宋体">对象后，再通过</span><span lang="EN-US">PropertyInfo</span><span style="font-family: 宋体">的</span><span lang="EN-US">SetValue</span><span style="font-family: 宋体">方法将改造后的</span><span lang="EN-US">connection</span><span style="font-family: 宋体">属性设置回</span><span lang="EN-US">table adapter</span><span style="font-family: 宋体">实例:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Reflection;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data.Common;<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;CDSafe.DBUtilities<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;a&nbsp;helper&nbsp;class&nbsp;when&nbsp;u&nbsp;are&nbsp;using&nbsp;a&nbsp;dataset's&nbsp;data&nbsp;adapter.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;it&nbsp;use&nbsp;the&nbsp;reflection&nbsp;to&nbsp;add&nbsp;the&nbsp;transaction&nbsp;into&nbsp;the&nbsp;data&nbsp;adpater's&nbsp;connection<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DataAdapterHelper<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;begin&nbsp;the&nbsp;transaction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="tableAdapter"&gt;</span><span style="color: #008000">the&nbsp;first&nbsp;data&nbsp;adapter&nbsp;in&nbsp;the&nbsp;transaction</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="isolationLevel"&gt;</span><span style="color: #008000">the&nbsp;isolation&nbsp;level&nbsp;of&nbsp;the&nbsp;transaction</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;</span><span style="color: #008000">&nbsp;a&nbsp;transaction&nbsp;object,&nbsp;use&nbsp;to&nbsp;add&nbsp;another&nbsp;data&nbsp;adapter&nbsp;into&nbsp;the&nbsp;same&nbsp;transaction</span><span style="color: #808080">&lt;/returns&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;DbTransaction&nbsp;BeginTransaction(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;tableAdapter,IsolationLevel&nbsp;isolationLevel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;adapterType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tableAdapter.GetType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbConnection&nbsp;connection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetAdpaterConnection(tableAdapter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(connection.State&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ConnectionState.Closed)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.Open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbTransaction&nbsp;transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;connection.BeginTransaction(isolationLevel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTransaction(tableAdapter,&nbsp;transaction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;&nbsp;begin&nbsp;the&nbsp;transaction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="tableAdapter"&gt;</span><span style="color: #008000">the&nbsp;first&nbsp;data&nbsp;adapter&nbsp;in&nbsp;the&nbsp;transaction</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;</span><span style="color: #008000">a&nbsp;transaction&nbsp;object,&nbsp;use&nbsp;to&nbsp;add&nbsp;another&nbsp;data&nbsp;adapter&nbsp;into&nbsp;the&nbsp;same&nbsp;transaction</span><span style="color: #808080">&lt;/returns&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;DbTransaction&nbsp;BeginTransaction(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;tableAdapter)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;BeginTransaction(tableAdapter,&nbsp;IsolationLevel.ReadCommitted);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;use&nbsp;the&nbsp;reflection&nbsp;to&nbsp;get&nbsp;the&nbsp;table&nbsp;adapter's&nbsp;connection&nbsp;object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="tableAdapter"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;</span><span style="color: #008000">the&nbsp;connection&nbsp;object</span><span style="color: #808080">&lt;/returns&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;DbConnection&nbsp;GetAdpaterConnection(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;tableAdapter)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;adapterType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tableAdapter.GetType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyInfo&nbsp;connectionProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;adapterType.GetProperty(</span><span style="color: #000000">"</span><span style="color: #000000">Connection</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BindingFlags.NonPublic&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;BindingFlags.Instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbConnection&nbsp;connection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DbConnection)connectionProperty.GetValue(tableAdapter,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;connection;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;attach&nbsp;the&nbsp;connection&nbsp;which&nbsp;contains&nbsp;a&nbsp;transaction&nbsp;on&nbsp;the&nbsp;data&nbsp;adapter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="tableAdapter"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="connection"&gt;&lt;/param&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetConnection(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;tableAdapter,&nbsp;DbConnection&nbsp;connection)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tableAdapter.GetType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyInfo&nbsp;connectionProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetProperty(</span><span style="color: #000000">"</span><span style="color: #000000">Connection</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;BindingFlags.NonPublic&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;BindingFlags.Instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionProperty.SetValue(tableAdapter,&nbsp;connection,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;set&nbsp;transaction&nbsp;on&nbsp;the&nbsp;other&nbsp;data&nbsp;adapter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="tableAdapter"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="transaction"&gt;&lt;/param&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetTransaction(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;tableAdapter,&nbsp;DbTransaction&nbsp;transaction)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;adapterType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tableAdapter.GetType();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyInfo&nbsp;commandsProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;adapterType.GetProperty(</span><span style="color: #000000">"</span><span style="color: #000000">CommandCollection</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BindingFlags.NonPublic&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;BindingFlags.Instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbCommand[]&nbsp;commands&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DbCommand[])commandsProperty.GetValue(tableAdapter,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(DbCommand&nbsp;command&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;commands)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.Transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyInfo&nbsp;adpterProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;adapterType.GetProperty(</span><span style="color: #000000">"</span><span style="color: #000000">Adapter</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BindingFlags.NonPublic&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;BindingFlags.Instance);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbDataAdapter&nbsp;dataAdapter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DbDataAdapter)adpterProperty.GetValue(tableAdapter,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dataAdapter.InsertCommand&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataAdapter.InsertCommand.Transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dataAdapter.DeleteCommand&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataAdapter.DeleteCommand.Transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dataAdapter.UpdateCommand&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataAdapter.UpdateCommand.Transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dataAdapter.SelectCommand&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataAdapter.SelectCommand.Transaction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;transaction;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetConnection(tableAdapter,&nbsp;transaction.Connection);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
DataAdater的command分两种，一种是Adapter成员变量的insert,update,delete，还有一种是使用向导创建的command，这类command被放到了<font face="Courier New">CommandCollection</font>集合内。所以设置transaction时应考虑这两种类型的command。<br />
该helper class使用范例如下：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestTableAdapter&nbsp;adapter1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;testTableAdapter();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TableAdapter2&nbsp;adapter2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;TableAdapter2();<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbTransaction&nbsp;trans&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;DataAdapterHelper.BeginTransaction(adapter1);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataAdapterHelper.SetTransaction(adapter2,&nbsp;trans);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter1.Insert(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter2.Insert(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">3</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,&nbsp;</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans.Commit();</span></div>
</span></span></span></span>&nbsp; 
<img src="http://www.cnblogs.com/xd125/aggbug/969970.html?type=1" width="1" height="1" alt=""/><p>评论: 19　<a href="http://www.cnblogs.com/xd125/archive/2007/11/23/969970.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/xd125/archive/2007/11/23/969970.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56803/" target="_blank">Yahoo 对 Google Buzz 的挑衅很不满：我们两年前就 Buzz 上了</a><span style="color:gray">(2010-02-10 10:19)</span><br/>· <a href="http://news.cnblogs.com/n/56802/" target="_blank">Google Buzz 第一时间上手体验，twitter + Facebook + Foursquare？</a><span style="color:gray">(2010-02-10 10:17)</span><br/>· <a href="http://news.cnblogs.com/n/56801/" target="_blank">微软发布13个安全补丁 平最高纪录</a><span style="color:gray">(2010-02-10 10:03)</span><br/>· <a href="http://news.cnblogs.com/n/56800/" target="_blank">Windows 7下MSN无法启动或报错解决方法</a><span style="color:gray">(2010-02-10 10:00)</span><br/>· <a href="http://news.cnblogs.com/n/56799/" target="_blank">百度第四季度净利润6270万美元 同比增48.2%</a><span style="color:gray">(2010-02-10 09:10)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>