<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_怕怕的韦恩卑鄙</title><subtitle type="text">永远害怕改变的宅男的窝</subtitle><id>http://feed.cnblogs.com/blog/u/15305/rss</id><updated>2011-03-24T10:11:29Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15305/rss"/><entry><id>http://www.cnblogs.com/waynebaby/archive/2011/03/24/1993860.html</id><title type="text">对资源加读写锁的容器</title><summary type="text">之前写了一篇《对不能用using的成对操作，快速扩展IDisposable的方法》提到了如何快速的把销毁操作用闭包的形式封装为IDisposable，并且实现了一个ReaderWriteerLockSlimHelper。 这里将对其中一个用况进行再次封装，建立一个可锁定的资源容器。</summary><published>2011-03-24T06:57:00Z</published><updated>2011-03-24T06:57:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2011/03/24/1993860.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2011/03/24/1993860.html"/><content type="html">&lt;p&gt;之前写了一篇《&lt;a href="http://www.cnblogs.com/waynebaby/archive/2010/12/09/1900998.html"  id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0"&gt;对不能用using的成对操作，快速扩展IDisposable的方法&lt;/a&gt;》提到了如何快速的把销毁操作用闭包的形式封装为IDisposable，并且实现了一个&lt;code &gt;ReaderWriteerLockSlimHelper。&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span  id="comment_body_1985321"&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;对于没有using的RWLock似乎已经很好用了， 但是我仍嫌弃其不够简单。&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;资源读写锁的应用，绝大多数是针对某批特定的资源。如果为这样的资源做一个封装，资源的引用需要被隐藏在封装内，封装外不通过读锁不可以访问资源。&lt;/span&gt;&lt;/code&gt;&lt;code &gt;&lt;span &gt;&lt;code &gt;显然ReaderWriteerLockSlimHelper却无法做到这一点。&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;我们在上文中已经建立了一个 Disposable对象，取得该对象意味着我们可以加锁，将其销毁我们就可以解锁，其生存期与整个加锁周期吻合。对于读写锁来说具有这种行为的对象是一种作为读写钥匙/令牌的存在。解锁后的资源引用放在这个令牌上作为属性暴露&lt;/span&gt;出来再合适不过了。&lt;/p&gt;&#xD;
&lt;p&gt;以此为考量，我们先设计一个实现IDisposable,读写锁的令牌&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 读写资源的令牌&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : IDisposable&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; _container;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 被锁住的资源引用&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; T Value { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 读写锁的原钥匙，对其销毁即为解锁&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDisposable _innerTicket;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建读写资源的令牌&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="value"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;解锁的资源引用&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="innerTicket"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;锁的真实引用&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="beforeDispose"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;在解锁前需要做的操作 如把资源的新值覆盖回锁住的资源&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="afterDispose"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;在解锁后需要做的操作 如写日志&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockToken(LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; container, IDisposable innerTicket, Action&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; beforeDispose, Action&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; afterDispose)&lt;br /&gt;        {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;           _container=container;&lt;br /&gt;            _innerTicket &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; innerTicket;&lt;br /&gt;            Value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; container._value;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;._disposeAction &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                () &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (beforeDispose &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) beforeDispose(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;(T);&lt;br /&gt;                        _innerTicket.Dispose();&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (afterDispose &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;) afterDispose(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                };&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDisposable Members&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 令牌销毁时要做的操作&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Action _disposeAction;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 销毁&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dispose()&lt;br /&gt;        {&lt;br /&gt;            _disposeAction();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span &gt;读写时，所做的操作略有不同。写令牌在销毁时要把令牌上的新引用/值 覆盖到容器内&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;依此我们可以做两个不同的令牌子类&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ReadLockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ReadLockToken(LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; container, ReaderWriterLockSlim _lock) :&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;(container, _lock.CreateLockScope(LockType.Read), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; WriteLockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; : LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; WriteLockToken(LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; container, ReaderWriterLockSlim _lock)&lt;br /&gt;            : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            (&lt;br /&gt;                container,&lt;br /&gt;                _lock.CreateLockScope(LockType.Write),&lt;br /&gt;                lt &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在解锁前 把新值保存给原对象 &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;  lt&lt;/span&gt;&lt;span style="color: #000000;"&gt;._container._value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;lt.Value;&lt;br /&gt;　　　　　　　　　　 },&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;　　　　　　　　　　null&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            )&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span &gt;这些做好后，编写容器就很容易了&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; T _value;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.Threading.ReaderWriterLockSlim _lock &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; System.Threading.ReaderWriterLockSlim();&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer(T value)&lt;br /&gt;        {&lt;br /&gt;            _value &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; GetReadToken()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ReadLockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt;, _lock);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;&lt;span style="color: #000000;"&gt; GetWriteToken()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; WriteLockToken&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;span face="Verdana" style="font-family: Verdana;"&gt;, _lock);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;&lt;span &gt;上面的内容很枯燥&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;p&gt;&lt;code &gt;&lt;span &gt;写读写锁的时候很方便&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Dictionary &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Type ,IFactoryContainer &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; planConnectionGetters&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Type, IFactoryContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Type, IFactoryContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;。。。。。。。。。。。。。。。。。。。。。。。。。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;planConnectionGetters.GetReadToken())&lt;br /&gt;            {&lt;br /&gt;                var dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; token.Value;&lt;br /&gt;                &lt;br /&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.TryGetValue(contractType , &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; channelFactory ))&lt;br /&gt;                 {&lt;br /&gt;                     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; channelFactory.GetChannel (uri);&lt;br /&gt;                 &lt;br /&gt;                 }&lt;br /&gt;            &lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; planConnectionGetters.GetWriteToken ())&lt;br /&gt;            {&lt;br /&gt;                var dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; token.Value;&lt;br /&gt;                &lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;dic.TryGetValue(contractType, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; channelFactory))&lt;br /&gt;                {&lt;br /&gt;                    Type t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(FactoryContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    channelFactory &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Activator.CreateInstance(t.MakeGenericType(contractType)) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; IFactoryContainer;&lt;br /&gt;                    dic.Add(contractType, channelFactory);&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;               &lt;br /&gt;&lt;br /&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;code &gt;&lt;span &gt;&lt;/span&gt;&lt;/code&gt;&amp;nbsp;如果容器经常保存字典等常用集合对象 我们也可以这样做一些扩展方法&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; TValue GetOrCreateValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TKey, TValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        (&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; LockableObjectContainer&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IDictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TKey, TValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; container,&lt;br /&gt;            TKey key,&lt;br /&gt;            Predicate &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; valueChecker,&lt;br /&gt;            Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; valueFactory&lt;br /&gt;        )&lt;br /&gt;        {  &lt;br /&gt;            TValue val&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt; (TValue);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; container.GetReadToken())&lt;br /&gt;            {&lt;br /&gt;              &lt;br /&gt;                var dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; token.Value;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.TryGetValue(key, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; val))&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (valueChecker (val))&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; val;&lt;br /&gt;                &lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var token &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; container.GetWriteToken())&lt;br /&gt;            {&lt;br /&gt;                var dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; token.Value;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.TryGetValue(key, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; val))&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (valueChecker(val))&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; val;&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;                val&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;valueFactory();&lt;br /&gt;                dic.Add(key,val) ;&lt;br /&gt;              &lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; val;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;------------------------------------------------------------&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;              TQueue q;&lt;br /&gt;                q &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; instanceQueues.GetOrCreateValue(instance, _ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;, () &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; TQueue());&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; q;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div  id="_mcePaste" style="position: absolute; width: 1px; height: 1px; overflow: hidden; top: 0px; left: -10000px;"&gt;﻿&lt;/div&gt;&lt;img src="http://www.cnblogs.com/waynebaby/aggbug/1993860.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/waynebaby/archive/2011/03/24/1993860.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2010/12/09/1900998.html</id><title type="text">对不能用using的成对操作，快速扩展IDisposable的方法</title><summary type="text">日常操作中有很多需要打开/关闭，加锁/解锁的成对操作。封装成IDisposable可能很烦。写 try catch finally 太丑本文记载了一种比较简单的通用解决方法。</summary><published>2010-12-09T03:13:00Z</published><updated>2010-12-09T03:13:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2010/12/09/1900998.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2010/12/09/1900998.html"/><content type="html">&lt;p&gt;日常操作中有很多需要打开/关闭&amp;nbsp;&amp;nbsp; 加锁/解锁的成对操作&lt;/p&gt;&#xD;
&lt;p&gt;有时候一些操作原生支持&amp;nbsp; IDisposable&lt;br /&gt;Monitor 可以用Lock(){}&amp;nbsp;&amp;nbsp; 但是ReadWriteLock 就难了。 还有WCF Channel等）。&lt;br /&gt;这种情况就要用&amp;nbsp; try/catch/finally，很是丑&lt;/p&gt;&#xD;
&lt;p&gt;封装成IDisposable可能很烦，因为多一个对象要多好多文档。&lt;/p&gt;&#xD;
&lt;p&gt;虽然AOP可能解决一些问题， 但是又没办法精确定位&amp;nbsp; scrope.&amp;nbsp; &lt;br /&gt;还是 IDisposable +using最爽&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所以写了一个缺省实现。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;  &#xD;
&#xD;
    /// 销毁帮手，生成可以支持using的自定义IDisposable实例&#xD;
    /// &amp;lt;remarks&amp;gt;感谢网友@doggo对于 +=OnDispose功能的測試，由於不完善這裡決定取消該功能&amp;lt;/remarks&amp;gt;&#xD;
&#xD;
    /// &amp;lt;/summary&amp;gt;  &#xD;
&#xD;
    public struct Disposable : IDisposable&#xD;
    {&#xD;
&#xD;
&#xD;
   &#xD;
        /// &amp;lt;summary&amp;gt;  &#xD;
&#xD;
        /// 创建销毁帮手实例  &#xD;
&#xD;
        /// &amp;lt;/summary&amp;gt;  &#xD;
&#xD;
        /// &amp;lt;param name="onCreate"&amp;gt;创建时要做的操作&amp;lt;/param&amp;gt;  &#xD;
&#xD;
        /// &amp;lt;param name="onDispose"&amp;gt;销毁是要做的操作&amp;lt;/param&amp;gt;  &#xD;
&#xD;
        public Disposable(Action onCreate, Action onDispose)&#xD;
        {&#xD;
            OnDispose = onDispose;&#xD;
&#xD;
&#xD;
            onCreate();&#xD;
&#xD;
        }&#xD;
&#xD;
&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;  &#xD;
&#xD;
        /// 销毁时要做的操作          &lt;/pre&gt;&#xD;
&lt;pre &gt;/// &amp;lt;/summary&amp;gt;  &#xD;
&#xD;
        private Action OnDispose&#xD;
        {&#xD;
&#xD;
                get ;set;&#xD;
&#xD;
             }  &#xD;
&#xD;
        ////// &amp;lt;summary&amp;gt;  &#xD;
&#xD;
        ////// 销毁时要做的操作  支持+=/Addhandler附加操作 （撤銷）  &#xD;
&#xD;
        ////// &amp;lt;/summary&amp;gt;  &#xD;
&#xD;
        //////public event Action OnDispose ;&#xD;
&#xD;
&#xD;
        #region IDisposable 成员&#xD;
&#xD;
&#xD;
&#xD;
        void IDisposable.Dispose()&#xD;
        {&#xD;
&#xD;
        &#xD;
            OnDispose();&#xD;
&#xD;
            OnDispose = null;&#xD;
&#xD;
        }&#xD;
&#xD;
&#xD;
&#xD;
        #endregion&#xD;
&#xD;
&#xD;
&#xD;
    } &#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;思路是用一个扩展方法，给一个无dispose 能力的对象 建立一个IDisposable的引用。&lt;/p&gt;&#xD;
&lt;p&gt;由于onCreate onDispose是闭包 额外的参数也是非必要的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里提供一个简易读写锁的实现。&amp;nbsp; 大家可以参考&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public static class ReaderWriteerLockSlimHelper &#xD;
    {&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 为读写锁创建支持using的IDisposable帮手&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="instance"&amp;gt;读写锁实例&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;param name="lockType"&amp;gt;加锁类型 读/写&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;returns&amp;gt;帮手实例&amp;lt;/returns&amp;gt;&#xD;
        public static IDisposable CreateDisposable(this ReaderWriterLockSlim instance, LockType lockType)&#xD;
        {&#xD;
            var kvp = LockDisposeDic[lockType];&#xD;
            return new Disposable(() =&amp;gt; kvp.Key(instance), () =&amp;gt; kvp.Value(instance));&#xD;
        }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 读写的不同操作字典&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        static Dictionary&amp;lt;LockType, KeyValuePair&amp;lt;Action&amp;lt;ReaderWriterLockSlim&amp;gt;, Action&amp;lt;ReaderWriterLockSlim&amp;gt;&amp;gt;&amp;gt; LockDisposeDic = new Dictionary&amp;lt;LockType, KeyValuePair&amp;lt;Action&amp;lt;ReaderWriterLockSlim&amp;gt;, Action&amp;lt;ReaderWriterLockSlim&amp;gt;&amp;gt;&amp;gt;()&#xD;
        {&#xD;
            {&#xD;
                LockType.Read, &#xD;
                new KeyValuePair&amp;lt;Action&amp;lt;ReaderWriterLockSlim&amp;gt;,Action&amp;lt;ReaderWriterLockSlim&amp;gt;&amp;gt; &#xD;
                    (&#xD;
                        ins=&amp;gt;ins.EnterReadLock(),&#xD;
                        ins=&amp;gt;ins.ExitReadLock()&#xD;
                    ) &#xD;
               &#xD;
            },&#xD;
            {&#xD;
                LockType.Write, &#xD;
                new KeyValuePair&amp;lt;Action&amp;lt;ReaderWriterLockSlim&amp;gt;,Action&amp;lt;ReaderWriterLockSlim&amp;gt;&amp;gt; &#xD;
                    (&#xD;
                        ins=&amp;gt;ins.EnterWriteLock(),&#xD;
                        ins=&amp;gt;ins.ExitWriteLock()&#xD;
                    ) &#xD;
               &#xD;
            }&#xD;
        };&#xD;
            &#xD;
    }&#xD;
&#xD;
    public enum LockType&#xD;
    {&#xD;
        Read,&#xD;
        Write&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实际使用起来就是爽。 这是一个在需要并发访问的队列中 加入对象的方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
        /// 加入有序队列。&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="item"&amp;gt;加入的项目&amp;lt;/param&amp;gt;&#xD;
        public void Enqueue(TValue item)&#xD;
        {&#xD;
            using (_lock.CreateDisposable(LockType.Write))&#xD;
            {&#xD;
                Queue&amp;lt;TValue&amp;gt; enqueueTarget;&#xD;
                var key=_keySelector(item);&#xD;
                if (!_items.ContainsKey(key))&#xD;
                {&#xD;
                    var sortValue = _sortValueSelector(item);&#xD;
                    if (!_index.TryGetValue( _sortValueSelector(item) ,out enqueueTarget ))&#xD;
                    {&#xD;
                        enqueueTarget = new Queue&amp;lt;TValue&amp;gt;();&#xD;
                        _index.Add(sortValue, enqueueTarget);&#xD;
                    }&#xD;
&#xD;
                    enqueueTarget.Enqueue(item);&#xD;
                    _items.Add(key, item);&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    throw new InvalidOperationException("this Item already in queue");&#xD;
                }&#xD;
            }&#xD;
&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;个人工作分享。希望能够帮助大家提高工作效率&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;附：&amp;nbsp;容易漏调结束行为的实现&amp;nbsp; 和try catch finally 实现&amp;nbsp; 大家比较下&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;出异常会死锁的错误﻿成对掉用&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
        /// 加入有序队列。&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="item"&amp;gt;加入的项目&amp;lt;/param&amp;gt;&#xD;
        public void Enqueue1(TValue item)&#xD;
        {&#xD;
            _lock.EnterWriteLock();&#xD;
&#xD;
    &#xD;
                Queue&amp;lt;TValue&amp;gt; enqueueTarget;&#xD;
                var key = _keySelector(item);&#xD;
                if (!_items.ContainsKey(key))&#xD;
                {&#xD;
                    var sortValue = _sortValueSelector(item);&#xD;
                    if (!_index.TryGetValue(_sortValueSelector(item), out enqueueTarget))&#xD;
                    {&#xD;
                        enqueueTarget = new Queue&amp;lt;TValue&amp;gt;();&#xD;
                        _index.Add(sortValue, enqueueTarget);&#xD;
                    }&#xD;
&#xD;
                    enqueueTarget.Enqueue(item);&#xD;
                    _items.Add(key, item);&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    throw new InvalidOperationException("this Item already in queue");&#xD;
                }&#xD;
                _lock.ExitReadLock(); //不但可能中途退出 还可能像这样写错解锁方法&#xD;
&#xD;
&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;正确而麻烦的try catch finally&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
        /// 加入有序队列。&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="item"&amp;gt;加入的项目&amp;lt;/param&amp;gt;&#xD;
        public void Enqueue2(TValue item)&#xD;
        {&#xD;
            _lock.EnterWriteLock();&#xD;
&#xD;
            try&#xD;
            {&#xD;
                Queue&amp;lt;TValue&amp;gt; enqueueTarget;&#xD;
                var key = _keySelector(item);&#xD;
                if (!_items.ContainsKey(key))&#xD;
                {&#xD;
                    var sortValue = _sortValueSelector(item);&#xD;
                    if (!_index.TryGetValue(_sortValueSelector(item), out enqueueTarget))&#xD;
                    {&#xD;
                        enqueueTarget = new Queue&amp;lt;TValue&amp;gt;();&#xD;
                        _index.Add(sortValue, enqueueTarget);&#xD;
                    }&#xD;
&#xD;
                    enqueueTarget.Enqueue(item);&#xD;
                    _items.Add(key, item);&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    throw new InvalidOperationException("this Item already in queue");&#xD;
                }&#xD;
            }&#xD;
            catch (Exception ex)&#xD;
            {&#xD;
                throw ex;&#xD;
            }&#xD;
            finally&#xD;
            {&#xD;
                _lock.ExitWriteLock();&#xD;
            &#xD;
            }&#xD;
&#xD;
&#xD;
        }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/waynebaby/aggbug/1900998.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/waynebaby/archive/2010/12/09/1900998.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2010/10/26/win7-x64-wpf-sl-aero-slow-fix.html</id><title type="text">intel I7平台Win7 x64 下wpf、silverlight 与aero特效动画缓慢故障排除一则</title><summary type="text">*貌似是炫耀博？*</summary><published>2010-10-26T14:55:00Z</published><updated>2010-10-26T14:55:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2010/10/26/win7-x64-wpf-sl-aero-slow-fix.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2010/10/26/win7-x64-wpf-sl-aero-slow-fix.html"/><content type="html">&lt;p&gt;*貌似是炫耀博？*&lt;/p&gt;&#xD;
&lt;p&gt;卑鄙本周新入一台&amp;nbsp; inter i7 平台 gts250 12g内存的主机&amp;nbsp; 自己折腾用。&lt;/p&gt;&#xD;
&lt;p&gt;win7 评分&lt;/p&gt;&#xD;
&lt;p&gt;cpu 内存7.5 &lt;/p&gt;&#xD;
&lt;p&gt;显示7.9&lt;/p&gt;&#xD;
&lt;p&gt;硬盘5.8&lt;/p&gt;&#xD;
&lt;p&gt;----------出问题了----------------&lt;/p&gt;&#xD;
&lt;p&gt;仆自以为很爽&amp;nbsp;，但是杯子和牙刷总是伴随存在的。&lt;/p&gt;&#xD;
&lt;p&gt;不想在安装win7 64后出现 最大化最小化停靠等aero动画速度缓慢的症状。&lt;/p&gt;&#xD;
&lt;p&gt;仔细观察 是把原来半秒左右的动画 逐桢以慢动作的方式延长到了一秒多。&lt;/p&gt;&#xD;
&lt;p&gt;后来开发wpf程序练习，发现checkbox标准动画 从unchecked状态到checked状态动画也要1秒多。心想这下坏了，wpf要废？&lt;/p&gt;&#xD;
&lt;p&gt;马上找一个silverlight 应用 cool.pptv.com&amp;nbsp;发现也是动画奇慢。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;---------用经验解决-----------------------&lt;/p&gt;&#xD;
&lt;p&gt;经观察wpf和sl的动画慢归满&amp;nbsp; 动作却非常平滑，毫无丢桢。8个cpu监视窗也在5%以下。&lt;/p&gt;&#xD;
&lt;p&gt;看起来是时钟频率有些问题。&lt;/p&gt;&#xD;
&lt;p&gt;sl wpf 和aero 一定是参考了一个不正确的时钟&amp;nbsp; 导致播放动画的用时计算出错。&lt;/p&gt;&#xD;
&lt;p&gt;只因为aero是定桢动画，而wpf于sl是dx加速的即时生成 才有显示上的差别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;i7太新了，有些功能win7还不能正确的支持吧？&lt;/p&gt;&#xD;
&lt;p&gt;google 10分钟无解。还是得自己想办法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打开bios 查看可疑的项目逐个设置观察，在cell设置中&amp;nbsp;cpu找到一个intel turbo boost的功能。&lt;/p&gt;&#xD;
&lt;p&gt;turbo让我想起儿时486sx 33。这个机器在前面版上有个turbo按键。按下去，面板上的频率数字就会从16变成33 khz，有时候在16khz状态下打开的dos游戏，如果按下turbo，就会突然变快。这招玩韩国街霸的时候很有用。&lt;/p&gt;&#xD;
&lt;p&gt;恩。。。似乎是和时钟频率相关。&lt;/p&gt;&#xD;
&lt;p&gt;关掉&lt;/p&gt;&#xD;
&lt;p&gt;f10&lt;/p&gt;&#xD;
&lt;p&gt;保存。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;重新进入系统 sl/wpf/aero&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;all pass. &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后来问硬件达人，说这是个叫做&amp;ldquo;睿频&amp;rdquo;的技术&amp;nbsp; 在空闲时候自动降频，在需要的时候还可能有超频。 &lt;/p&gt;&#xD;
&lt;p&gt;我想，这个技术也许不错，物尽其用嘛。但用它跑时间敏感的应用，比如秒表啊，性能计数啊，网络游戏啊 blabla..，我是不大敢。还是关上保险点。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;鉴于之前google无果，特发于博上，希望后来者能够参考。&lt;/p&gt;&#xD;
&lt;p&gt;希望win7 x64 和intel 早点互通有无 随时把最新的时钟频率更新给用户态。&amp;nbsp;&lt;a&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/waynebaby/aggbug/1861969.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/waynebaby/archive/2010/10/26/win7-x64-wpf-sl-aero-slow-fix.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2010/02/20/1669695.html</id><title type="text">今天被Prism里面的一段代码雷到了</title><summary type="text">public virtual bool CanExecute(object parameter) { bool hasEnabledCommandsThatShouldBeExecuted = false; ICommand[] commandList; lock (this.registeredCommands) { commandList = this.registeredCommands.T...</summary><published>2010-02-20T06:01:00Z</published><updated>2010-02-20T06:01:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2010/02/20/1669695.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2010/02/20/1669695.html"/><content type="html">&lt;pre &gt;public virtual bool CanExecute(object parameter)&#xD;
        {&#xD;
            bool hasEnabledCommandsThatShouldBeExecuted = false;&#xD;
&#xD;
            ICommand[] commandList;&#xD;
            lock (this.registeredCommands)&#xD;
            {&#xD;
                commandList = this.registeredCommands.ToArray();&#xD;
            }&#xD;
            foreach (ICommand command in commandList)&#xD;
            {&#xD;
                if (this.ShouldExecute(command))&#xD;
                {&#xD;
                    if (!command.CanExecute(parameter))&#xD;
                    {&#xD;
                        return false;&#xD;
                    }&#xD;
&#xD;
                    hasEnabledCommandsThatShouldBeExecuted = true;&#xD;
                }&#xD;
            }&#xD;
&#xD;
            return hasEnabledCommandsThatShouldBeExecuted;&#xD;
        }&#xD;
&#xD;
&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/waynebaby/aggbug/1669695.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/waynebaby/archive/2010/02/20/1669695.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/10/28/1591651.html</id><title type="text">1080*1920 下看网站很爽</title><summary type="text"/><published>2009-10-28T12:36:00Z</published><updated>2009-10-28T12:36:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/10/28/1591651.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/10/28/1591651.html"/></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/08/27/1555034.html</id><title type="text">游戏大厅 从基础开始（8）--绕回来细说聊天室（下）垃圾列表</title><summary type="text">没错，这次章节没有女仆。 前情回顾 我们的最初的需求是建立一个拉模式下用户暂存的顺序信息池  还是这张工作模式图 我们可以把这个需求设计为 Clear:清除所有内容GetEnumerator :实现枚举器，新向旧方向的顺序枚举,这样一旦到达上次读取的时间就可以中断枚举。RecycleFromButtom：从旧向前进行搜索 把满足条件的扔到GCStackOn :把一个新信息放在堆栈的顶部 这就好像是...</summary><published>2009-08-27T06:06:00Z</published><updated>2009-08-27T06:06:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/08/27/1555034.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/08/27/1555034.html"/></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/08/22/1552206.html</id><title type="text">游戏大厅 从基础开始（7）--绕回来细说聊天室（中间偏下）之女仆编年史2</title><summary type="text">&amp;#160;  老少爷们儿反击战  上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了，少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊  这是永远1v1被人私有的女奴 和  喝茶时被人共有的女仆酱最明显的差异~  明媚的午后阳光下，庭院里白色长餐桌两旁，英俊的少爷们彼此交换着最近的趣闻轶事，一面欣赏女仆酱以1/3几率打翻茶水，可爱而笨笨地努力侍奉着，闪闪发光的样子。  人间极乐喵~...</summary><published>2009-08-22T14:59:00Z</published><updated>2009-08-22T14:59:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/08/22/1552206.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/08/22/1552206.html"/></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/08/21/1551761.html</id><title type="text">游戏大厅 从基础开始（6）--绕回来细说聊天室（中）之女仆编年史1</title><summary type="text">上一篇我们大致的了解了几种聊天室的行为模式 最简单明了的推模式 几乎不需要任何多余的语言来描述它的实现 这一篇我们看看如何实现拉模式更有效。 本图清晰的表现了"拉"模式聊天室的行为。 并发多用户向数据池写数据 并发多用户从数据池读书据 数据最好以时间为顺序储存在集合中 某时间向后的枚举查找将是最大的消耗。 聊天室进化 -女仆编年史神秘的原始社会 仍然参考我们神奇朴素的Asp3聊天室 53 Appl...</summary><published>2009-08-21T15:40:00Z</published><updated>2009-08-21T15:40:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/08/21/1551761.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/08/21/1551761.html"/></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/08/19/1550161.html</id><title type="text">游戏大厅 从基础开始（5）--绕回来细说聊天室（上）</title><summary type="text">距离上次写大厅已经有几个月。中间工作繁忙，待学习的东西又很多，又有很多新产品的想法想实践，一直把这个坑闲置着。直到前两天简单的树遍历枚举器-挑战一个程序员到底能多懒 装配脑袋的几个回帖给我带来一些灵感，让我又重新看看我聊天频道的实现，发现竟然有很多可以推敲重新处理的地方。昨天上班的时候又把聊天部分整理了下，愿和大家分享。Wiki定义的聊天室网络聊天室通常直称聊天室，是一种人们可以在线交谈的的网络论...</summary><published>2009-08-19T12:41:00Z</published><updated>2009-08-19T12:41:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/08/19/1550161.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/08/19/1550161.html"/></entry><entry><id>http://www.cnblogs.com/waynebaby/archive/2009/08/16/1546980.html</id><title type="text">简单的树遍历枚举器v0.2-挑战一个程序员到底能多懒- 添加广度优先遍历</title><summary type="text">前一阵在递归算法相关回贴的讨论中 和某lz抱怨 现在的同志们连用自己的栈加循环模拟递归都不会做了。如果自己实现递归栈 又怎么会在线程栈中储存过多无关信息？数据全部都在堆里 又怎会stackoverflow?当时就有想法自己实现一个，造福一下群众，但是被坏心眼的某lz 阻止了。&amp;#8220;让他们自己写。&amp;#8221; 他大概是这么说滴，&amp;#8220;他们自己写了才算懂得了。&amp;#8221;可是 最近...</summary><published>2009-08-15T17:53:00Z</published><updated>2009-08-15T17:53:00Z</updated><author><name>韦恩卑鄙 a-zhewg @waynebaby</name><uri>http://www.cnblogs.com/waynebaby/</uri></author><link rel="alternate" href="http://www.cnblogs.com/waynebaby/archive/2009/08/16/1546980.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/waynebaby/archive/2009/08/16/1546980.html"/></entry></feed>
