<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.NET Archives | Xiaoming Tu - Blog</title>
	<atom:link href="https://www.xiaomingtu.com/tags/net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaomingtu.com/tags/net</link>
	<description>学习、工作、生活，点点滴滴。</description>
	<lastBuildDate>Sun, 23 Oct 2016 23:02:12 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>How to resolve deadlock in asynchronization code with async/await</title>
		<link>https://www.xiaomingtu.com/archives/15737?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=resolve-deadlock-asynchronization-code-asyncawait</link>
					<comments>https://www.xiaomingtu.com/archives/15737#comments</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Sun, 16 Oct 2016 23:10:51 +0000</pubDate>
				<category><![CDATA[专业技术]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[await]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[task]]></category>
		<category><![CDATA[unit tests]]></category>
		<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">http://xiaomingtu.com/?p=15737</guid>

					<description><![CDATA[<p>Background In .NET, there are currently three main asynchronous programming models: Asynchronous Programming Model (APM), Event-based Asynchronous Pattern (EAP) and Task-based Asynchronous Pattern (TAP). The TAP is the latest technology that is based on the Task and Task&#60;T&#62; types (available since .NET 4.0) in the System.Threading.Tasks namespace. Programmers can also use async/await keywords to improve the code [&#8230;]</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15737">How to resolve deadlock in asynchronization code with async/await</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Background</h2>
<p>In .NET, there are currently three main asynchronous programming models: <strong>Asynchronous Programming Model (APM)</strong>, <strong>Event-based Asynchronous Pattern (EAP)</strong> and <strong>Task-based Asynchronous Pattern (TAP)</strong>. The TAP is the latest technology that is based on the Task and Task&lt;T&gt; types (available since .NET 4.0) in the System.Threading.Tasks namespace. Programmers can also use async/await keywords to improve the code readability since C# 5.0. There is a <a href="https://msdn.microsoft.com/en-us/library/hh873178(v=vs.110).aspx" target="_blank">MSDN article</a> explaining on the interop of the TAP model with previous asynchronous models. When programming in an asynchronous way, programmers need to be very careful of the deadlock. In this post, a common deadlock issue in TAP is explained and solutions are provided to avoid it in both production code and unit tests.</p>
<h2>Problem</h2>
<p>Here is the code-behind of a form. There is a button named <em>button1</em> and a text box named <em>textbox1</em> on the form. When the button is clicked, it runs a long time job that is sleeping for 2 seconds and shows a message in the text box then.</p><pre class="urvanov-syntax-highlighter-plain-tag">public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        InvokeTask();
    }

    public void InvokeTask()
    {
        textBox1.Text = $"Start task at {DateTime.Now.ToString("T")} and wait";

        var task = DoLongTimeJob();
        task.Wait();

        textBox1.Text = $"Task finished at {DateTime.Now.ToString("T")}";
    }

    public static async Task DoLongTimeJob()
    {
        await Task.Delay(TimeSpan.FromSeconds(2));
    }
}</pre><p><span id="more-15737"></span></p>
<h2>Investigation</h2>
<p>As we all know, Windows applications is based on a single-threaded model. A message pump runs on the main thread which listens and dispatches messages to the different listeners. The above code run into a deadlock because of this. How does it happen?</p>
<p>On line 18, the main UI thread waits for the task to complete here. On line 25, the code were put on a different thread to run which just sleep for 2 seconds. After that, it tries to return back to the main UI thread. The reason is that the default behaviour of the &#8216;<em>await</em>&#8216;  keyword will let the code after it to run in the original synchronization context. You can think of the synchronization context as a thread. If you click the button, <strong>the deadlock happens because the main UI thread is waiting for the task to complete and the awaiter (line 25) is waiting for the main UI thread to be available for running the remaining code.</strong> Although there is no &#8216;visible&#8217; code after &#8216;<em>await</em>&#8216;, the awaiter still needs to let the function finish.</p>
<h2>Resolve in Production Code</h2>
<p>You may have not noticed this deadlock in the past because it is quite common to use the &#8216;async void&#8217; event handler instead of a normal event handler when using TAP in WinForm applications. The code usually look like the following. Note the usage of <em>async</em>/<em>await</em> in both &#8216;button1_Click&#8217; and &#8216;InvokeTask&#8217; method.</p><pre class="urvanov-syntax-highlighter-plain-tag">public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await InvokeTask();
    }

    public async Task InvokeTask()
    {
        textBox1.Text = $"Start task at {DateTime.Now.ToString("T")} and wait";

        await DoLongTimeJob();

        textBox1.Text = $"Task finished at {DateTime.Now.ToString("T")}";
    }

    public static async Task DoLongTimeJob()
    {
        await Task.Delay(TimeSpan.FromSeconds(2));
    }
}</pre><p>The magic here is the &#8216;async void&#8217; event handler. It is called differently by the runtime because it <em>returns (not completed yet)</em> immediately when it reaches the first &#8216;await&#8217; in its function body [<a href="http://stackoverflow.com/a/27228597/1671263" target="_blank">SO answer</a>]. So, in production code, you should try to use async/await all the way &#8216;up&#8217; to the event handlers or controllers&#8217; actions if in a ASP.NET application.</p>
<h2>Problem In Unit Tests</h2>
<p>What about unit testing the DoLongTimeJob method? In NUnit, the following methods code could be used to this method.</p><pre class="urvanov-syntax-highlighter-plain-tag">[Test]
public void TestWithWait()
{
    // Act
    var task = Form1.DoLongTimeJob();
    task.Wait();

    // Assert
    Assert.That(task.IsCompleted, Is.True);
}

[Test]
public async Task TestWithAwait()
{
    // Act
    await Form1.DoLongTimeJob();

    // Can assert on the return value if the task has results.
}</pre><p>This two tests runs absolutely fine if they run solely but, both of them can&#8217;t finish when they run with the following test together. (Note the following test runs before above ones).</p><pre class="urvanov-syntax-highlighter-plain-tag">[Test]
public void TestRunFirst()
{
    var newTitle = "form title";
    using (var form = new Form1())
    {
        form.Text = newTitle;

        Assert.That(form.Text, Is.EqualTo(newTitle));
    }
}</pre><p>Why does this happen? If we put a break point  at the beginning of the <em>TestWithWait</em> method (line 3 of Code Sample 3), run the test solely and run the test with <em>TestRunFirst</em>. Have a look at the SynchronizationContext.Current and here are the difference. When it runs solely, the SynchronizationContext.Current is <strong>null</strong>.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-15743" src="http://xiaomingtu.com/wp-content/uploads/2016/10/Solely-300x111.jpg" alt="TestWithWait runs solely" width="522" height="193" srcset="https://www.xiaomingtu.com/wp-content/uploads/2016/10/Solely-300x111.jpg 300w, https://www.xiaomingtu.com/wp-content/uploads/2016/10/Solely-768x285.jpg 768w, https://www.xiaomingtu.com/wp-content/uploads/2016/10/Solely.jpg 846w" sizes="(max-width: 522px) 100vw, 522px" /></p>
<p>However, when it runs with <em>TestRunFirst</em>, the value of SynchronizationContext.Current is an instance of the <strong>WindowsFormsSynchronizationContext</strong>.</p>
<p><img decoding="async" class="alignnone wp-image-15744" src="http://xiaomingtu.com/wp-content/uploads/2016/10/WithTestRunFirst-300x106.jpg" alt="TestWithWait runs with UI test" width="521" height="184" srcset="https://www.xiaomingtu.com/wp-content/uploads/2016/10/WithTestRunFirst-300x106.jpg 300w, https://www.xiaomingtu.com/wp-content/uploads/2016/10/WithTestRunFirst-768x272.jpg 768w, https://www.xiaomingtu.com/wp-content/uploads/2016/10/WithTestRunFirst.jpg 886w" sizes="(max-width: 521px) 100vw, 521px" /></p>
<p>As you could remember, the test is running in the same way as in the normal event handler (not the &#8216;async void&#8217; event handler).</p>
<p>Why does the SynchronizationContext.Current change? In WinForm applications, whenever a UI control is created, the current synchronization context will be changed to an instance of the WindowsFormssynchronizationContext. This can be simply validated by putting a break point in the Program.cs just before the form is created. You can see the synchronization context changed from <em>null</em> to <em>WindowsFormssynchronizationContext</em>.</p>
<h2>Resove in Unit Tests</h2>
<p>There are several ways to avoid the deadlock as long as you know the reason. The first method is to run the task on a different thread other than the current thread. (Please note that I have changed to use thread instead of synchronization context for the sake of simplicity.) This can be done by calling Task.Run method which will run the task on a thread from the thread pool.</p><pre class="urvanov-syntax-highlighter-plain-tag">[Test]
public void When_DoLongTimeJob_Called_Then_Task_Can_Be_Completed()
{
    // Act
    var task = Task.Run(async () =&gt; await Form1.DoLongTimeJob());

    // Assert
    Assert.That(task.IsCompleted, Is.True);
}</pre><p>The second method is to change the behaviour of the DoLongTimeJob method. Let it run the subsequent code on a different thread instead of entering to the original thread. The <a href="https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.configureawait(v=vs.110).aspx" target="_blank">Task.ConfigureAwait(bool) </a>method allows you to do this. The method will be looked like the following.</p><pre class="urvanov-syntax-highlighter-plain-tag">public static async Task DoLongTimeJob()
{
    await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
}</pre><p>Passing a <em>false</em> to the <em>ConfigureAwait</em> method. It tells the awaiter to not capture the original context and continue the execution on a different thread. It is <a href="http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html" target="_blank">recommended to be a good practice</a> to always call <em>ConfigureAwait(false)</em> on every &#8216;await&#8217; EXCEPT the remaining code after &#8216;await&#8217; must be run on the original thread. For example in the InvokeTask method as shown in Code Sample 1, line 20 needs to access the UI control, so it must be run on the original thread which is the main UI thread. Note that every async methods are independent. Configuring the awaiter only affects the current &#8216;async&#8217; method.</p>
<p>NOTE! If you want to use this method to solve the second test in Code Sample 3, you must append ConfigureAwait(false) at the end of 
			<span id="urvanov-syntax-highlighter-6ada8beb24a05533890762" class="urvanov-syntax-highlighter-syntax urvanov-syntax-highlighter-syntax-inline  crayon-theme-classic crayon-theme-classic-inline urvanov-syntax-highlighter-font-monaco" style="font-size: 12px !important; line-height: 15px !important;font-size: 12px !important;"><span class="crayon-pre urvanov-syntax-highlighter-code" style="font-size: 12px !important; line-height: 15px !important;font-size: 12px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><span class="crayon-r">await</span><span class="crayon-h"> </span><span class="crayon-v">Form1</span><span class="crayon-sy">.</span><span class="crayon-e">DoLongTimeJob</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></span></span> , otherwise the test still gets blocked because the execution tries to go back to the original thread which is created in WindowsFormsSynchronizationContext as well.</p>
<p>The last method is to explicitly clear the SynchronizationContext when running your tests. This can be done in the SetUp method before every tests are run. The current synchronization context is cleared so that it does affect the current test.</p><pre class="urvanov-syntax-highlighter-plain-tag">[SetUp]
public void Setup()
{
    SynchronizationContext.SetSynchronizationContext(null);
}</pre><p></p>
<h2>Conclusion</h2>
<p>Any of the above methods can help you avoiding the deadlock in unit tests. Personally, I prefer to apply ConfigureAwait as much as possible because, when you create an async method, you are delegating work on a different thread and have less interests on the state of the current thread. In the unit tests, either the first method or the third method works. The third method is preferable as it does not slow the tests because of the resource allocations for additional tasks.</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15737">How to resolve deadlock in asynchronization code with async/await</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/15737/feed</wfw:commentRss>
			<slash:comments>272</slash:comments>
		
		
			</item>
		<item>
		<title>.NET中的垃圾回收机制</title>
		<link>https://www.xiaomingtu.com/archives/15531?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=net%25e4%25b8%25ad%25e7%259a%2584%25e5%259e%2583%25e5%259c%25be%25e5%259b%259e%25e6%2594%25b6%25e6%259c%25ba%25e5%2588%25b6</link>
					<comments>https://www.xiaomingtu.com/archives/15531#comments</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Wed, 15 Aug 2012 21:21:24 +0000</pubDate>
				<category><![CDATA[专业技术]]></category>
		<category><![CDATA[开发语言]]></category>
		<category><![CDATA[有图有真相]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[GC]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[垃圾回收]]></category>
		<guid isPermaLink="false">http://www.xiaomingtu.com/?p=15531</guid>

					<description><![CDATA[<p>通过一个小程序介绍了.NET中的内存管理机制。</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15531">.NET中的垃圾回收机制</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>在.NET中，应用程序的内存分成两个部分，一部分为托管内存，由.NET运行时（CLR）进行管理；另外一部分为非托管内存（通过Win32 API或者Marshal.AllocateXXX方法分配），需要程序员自己进行管理。托管内存都在堆（Heap）中进行分配，在这个堆中，.NET通过不同的“代”（Generation）来组织对象。托管堆共分成三代：<span id="more-15531"></span></p>
<ul>
<li>第0代（Generation 0）：这一代是最年轻的，其中包含一些短生存期的对象，比如方法中的局部变量等。这一代的对象会被回收的比较频繁，在新建对象的时候，一般会创建在这一代中。</li>
<li>第1代（Generation 1）：这一代中的对象也是短生存期的，但只是作为一个过渡。一些较大的对象，在创建的时候也会在这一代。</li>
<li>第2代（Generation 2）：这一代中的对象都是长生存期的，比如静态类、静态成员等。他们被回收的概率会很低，所以在编写程序的时候应该尽量避免使用静态成员。</li>
</ul>
<p>在每一代中的执行（通过显式调用GC.Collect方法）一次内存回收时，如果有对象无法被回收，它们将被移到下一代中。比如第1代中定义了一个对象，它在一次回收操作中无法被回收，那它就会被移到第1代中去。这样的好处就是移动之后的对象下次不会再被频繁的尝试去回收。因为越是后代中的对象，被回收的频率就越低。</p>
<p>下面通过一个非常简单的程序来演示内存回收，它主要的功能是通过一个循环不断地创建一个数组，我们主要研究这些数组所占用的内存在何时会被回收。代码中的Sleep语句主要是为了让结果显示的明显一些，否则因为时间间隔太小，而看不清楚内存的变化。接下去的测试都是基于下面的代码：</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = 10;
            float[] x = null;

            for (int i = 0; i &lt; N; i++)
            {
                Console.WriteLine(i.ToString());

                x = new float[1000000];
                //Thread.Sleep(1000);
                //GC.Collect();
            }

            x = null;
        }
    }
}</pre><p>第一次尝试，数组大小为1000，未开启Collect：</p>
<p style="text-align: center;"><a href="https://www.xiaomingtu.com/wp-content/uploads/2012/08/1.png" target="_blank"><img decoding="async" class="aligncenter size-medium wp-image-15536" title="第一次尝试结果" src="https://www.xiaomingtu.com/wp-content/uploads/2012/08/1-300x175.png" alt="第一次尝试结果" width="300" height="175" srcset="https://www.xiaomingtu.com/wp-content/uploads/2012/08/1-300x175.png 300w, https://www.xiaomingtu.com/wp-content/uploads/2012/08/1.png 1538w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>上图纵坐标为程序占用的内存数（字节）；横坐标是执行时间（秒）（下同）。可以看到内存一直在增加，并没有降低过。</p>
<p>第二次尝试，数组大小为1000，开启Collect：</p>
<p style="text-align: center;"><a href="https://www.xiaomingtu.com/wp-content/uploads/2012/08/2.png" target="_blank"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-15537" title="第二次尝试" src="https://www.xiaomingtu.com/wp-content/uploads/2012/08/2-300x175.png" alt="第二次尝试" width="300" height="175" srcset="https://www.xiaomingtu.com/wp-content/uploads/2012/08/2-300x175.png 300w, https://www.xiaomingtu.com/wp-content/uploads/2012/08/2.png 1538w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>我们可以看到，每隔一秒钟（就是我们Sleep的时间），内存就会下降一块。</p>
<p>第三次尝试，数组大小为1000000，未开启Collect：</p>
<p style="text-align: center;"><a href="https://www.xiaomingtu.com/wp-content/uploads/2012/08/3.png" target="_blank"><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-15538" title="第三次尝试" src="https://www.xiaomingtu.com/wp-content/uploads/2012/08/3-300x175.png" alt="第三次尝试" width="300" height="175" srcset="https://www.xiaomingtu.com/wp-content/uploads/2012/08/3-300x175.png 300w, https://www.xiaomingtu.com/wp-content/uploads/2012/08/3.png 1538w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>结果与第二次尝试类似，因为每次创建的数组大小非常大，已经达到垃圾回收器内置的阈值，所以会自动执行回收。</p>
<p>垃圾回收器的工作机制比较复杂，已经不在本文的讨论范围内了，有兴趣的同学可以参考MSDN中的相关文章。推荐下面一片文章，介绍了GC的基本知识以及一些性能提升点：</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms973837.aspx">http://msdn.microsoft.com/en-us/library/ms973837.aspx</a></p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15531">.NET中的垃圾回收机制</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/15531/feed</wfw:commentRss>
			<slash:comments>382</slash:comments>
		
		
			</item>
		<item>
		<title>使用WinDbg查找内存泄漏问题</title>
		<link>https://www.xiaomingtu.com/archives/15278?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bd%25bf%25e7%2594%25a8windbg%25e6%259f%25a5%25e6%2589%25be%25e5%2586%2585%25e5%25ad%2598%25e6%25b3%2584%25e6%25bc%258f%25e9%2597%25ae%25e9%25a2%2598</link>
					<comments>https://www.xiaomingtu.com/archives/15278#comments</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Fri, 03 Dec 2010 00:09:33 +0000</pubDate>
				<category><![CDATA[专业技术]]></category>
		<category><![CDATA[开发语言]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[桌面应用]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[windbg]]></category>
		<category><![CDATA[内存泄漏]]></category>
		<guid isPermaLink="false">http://www.xiaomingtu.com/archives/15278</guid>

					<description><![CDATA[<p>WinDbg安装 下载地址：32位 64位 双击运行，在Install Options中选择“Common Utilities”下的“Debugging Tools For Windows”： （我这里已经安装过了，所以显示是灰色的。） 安装完成之后，可以在“开始”-“所有程序”-“ Debugging Tools for Windows (x86)”中找到。 将WinDbg安装目录（ “C:\Program Files\Debugging Tools for Windows (x86)”）添加到“Path”环境变量中。 场景设计 比如有一个多文档应用程序，在代码中设计了一个管理类用于管理打开的各个文档窗口，为了便于各个模块通过访问这个类获取打开的文档清单，因此将类中的List定义为静态变量。但是由于程序员的疏忽，在文档关闭的时候List中对应的引用并没有删除，导致内存泄漏。 场景创建 Visual Studio中创建一个WindowsApplication，新建一个MDIParent窗口： 修改Program.cs中的启动窗口为此MDIParent。添加一个名为“DocumentEditorManager”的类，用下面的代码替换里面的内容： [crayon-6ada8beb25457073670474/] 在MDIParent.cs文件中查找到ShowNewForm方法，修改为如下代码： [crayon-6ada8beb2545a102902957/] &#160; 按F5运行程序之后，打开任务管理器，多次点击工具栏中的“New”按钮，发现内存一直在上涨，即使把打开的窗口关闭了，内存依旧未释放。 发现问题原因 关闭程序，在工程下找到生成的EXE文件并运行（不要直接在VS中运行程序）。打开WinDbg，在菜单中选择“Attach to a Process”： 在打开的窗口中找到对应的程序，点击OK： 这时候，程序已经不能交互了，因为已经进入调试模式，类似于VS中命中断点时的情景。在WinDbg中能看到程序所加载的所有文件： WinDbg支持扩展DLL来提供更加丰富的调试功能，调试.NET程序需要用到的是“SOS.DLL”模块（SOS.DLL所支持的所有命令可以在这里找到。），它包含在每个版本的.NET Framework中（比如2.0版本的路径为C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll），安装完WinDbg之后已经有一份在WinDbg的安装目录下了，输入下面的命令加载“SOS.DLL”： [crayon-6ada8beb2545b873772082/] 在WinDbg中按F5继续运行程序，使其跳出调试模式，切换到程序中，按10次“New”按钮创建10个窗口，然后关闭这10个窗口（这个过程相当于程序运行了一段时间回到最初的状态，但是内存没有减少），我们需要通过WinDbg找到是什么类出现了问题。切换到WinDbg，在菜单“Debug”中找到“Break”点击中断程序： 输入“!dumpheap –type WindowsFormsApplication3”罗列出我们程序的所有类实例： MT与类型的概念差不多，只要类型一样，这个MT地址就一样，红色的方框中可以看到有两种，一种是1个，另外一种是10个，与Statistics中的内容一致。 理论上来说，所有的Form1都已经关闭了，应该不存在这样的对象，有些人可能觉得是垃圾回收器还没来得及回收的缘故，我们可以做一个实验，修改程序，在工具栏中加一个按钮“Clear Memory”，并在Click事件中编写如下的代码： [crayon-6ada8beb25460674370949/] 当关闭10个窗口之后点击此按钮，再在WinDbg中用dumpheap命令查看对象清单，发现它们依旧存在。 这说明垃圾回收器并没有回收它们，.NET中的垃圾回收器只会回收没有被使用的对象，所以这些Form1对象依旧被使用，那是谁在使用它们呢，我们可以通过查看其中一个对象实例的引用列表来找到源头： 比如看其中一个地址为“01f78160”的对象引用，使用下面的命令： [&#8230;]</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15278">使用WinDbg查找内存泄漏问题</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>WinDbg安装</h3>
<p>下载地址：<a href="http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx">32位</a> <a href="http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx">64位</a></p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image001.png"><img loading="lazy" decoding="async" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image001" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image001_thumb.png" alt="clip_image001" width="163" height="65" border="0" /></a></p>
<p>双击运行，在Install Options中选择“Common Utilities”下的“Debugging Tools For Windows”：<span id="more-15278"></span></p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image003.jpg"><img loading="lazy" decoding="async" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image003" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image003_thumb.jpg" alt="clip_image003" width="411" height="291" border="0" /></a></p>
<p><em>（我这里已经安装过了，所以显示是灰色的。）</em><em> </em></p>
<p>安装完成之后，可以在“开始”-“所有程序”-“ Debugging Tools for Windows (x86)”中找到。</p>
<p>将WinDbg安装目录（ “C:\Program Files\Debugging Tools for Windows (x86)”）添加到“Path”环境变量中。</p>
<h3>场景设计</h3>
<p>比如有一个多文档应用程序，在代码中设计了一个管理类用于管理打开的各个文档窗口，为了便于各个模块通过访问这个类获取打开的文档清单，因此将类中的List定义为静态变量。但是由于程序员的疏忽，在文档关闭的时候List中对应的引用并没有删除，导致内存泄漏。</p>
<h3>场景创建</h3>
<p>Visual Studio中创建一个WindowsApplication，新建一个MDIParent窗口：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image005.jpg"><img loading="lazy" decoding="async" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image005" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image005_thumb.jpg" alt="clip_image005" width="421" height="293" border="0" /></a></p>
<p>修改Program.cs中的启动窗口为此MDIParent。添加一个名为“DocumentEditorManager”的类，用下面的代码替换里面的内容：</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    class DocumentEditorManager
    {
        internal static List&lt;Form&gt; DocumentEditors = new List&lt;Form&gt;();
    }
}</pre><p>在MDIParent.cs文件中查找到ShowNewForm方法，修改为如下代码：</p><pre class="urvanov-syntax-highlighter-plain-tag">private void ShowNewForm(object sender, EventArgs e)
{
    Form1 childForm = new Form1();
    DocumentEditorManager.DocumentEditors.Add(childForm);
    childForm.MdiParent = this;
    childForm.Text = "Document " + childFormNumber++;
    childForm.Show();
}</pre><p>&nbsp;</p>
<p>按F5运行程序之后，打开任务管理器，多次点击工具栏中的“New”按钮，发现内存一直在上涨，即使把打开的窗口关闭了，内存依旧未释放。</p>
<h3>发现问题原因</h3>
<p>关闭程序，在工程下找到生成的EXE文件并运行（不要直接在VS中运行程序）。打开WinDbg，在菜单中选择“Attach to a Process”：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image006.png"><img loading="lazy" decoding="async" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image006" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image006_thumb.png" alt="clip_image006" width="244" height="143" border="0" /></a></p>
<p>在打开的窗口中找到对应的程序，点击OK：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image007.png"><img loading="lazy" decoding="async" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image007" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image007_thumb.png" alt="clip_image007" width="244" height="150" border="0" /></a></p>
<p>这时候，程序已经不能交互了，因为已经进入调试模式，类似于VS中命中断点时的情景。在WinDbg中能看到程序所加载的所有文件：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image009.jpg"><img loading="lazy" decoding="async" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image009" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image009_thumb.jpg" alt="clip_image009" width="406" height="272" border="0" /></a></p>
<p>WinDbg支持扩展DLL来提供更加丰富的调试功能，调试.NET程序需要用到的是“SOS.DLL”模块（SOS.DLL所支持的所有命令可以在<a href="http://msdn.microsoft.com/en-us/library/bb190764(VS.80).aspx">这里</a>找到。），它包含在每个版本的.NET Framework中（比如2.0版本的路径为C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll），安装完WinDbg之后已经有一份在WinDbg的安装目录下了，输入下面的命令加载“SOS.DLL”：</p><pre class="urvanov-syntax-highlighter-plain-tag">.load sos.dll</pre><p>在WinDbg中按F5继续运行程序，使其跳出调试模式，切换到程序中，按10次“New”按钮创建10个窗口，然后关闭这10个窗口（这个过程相当于程序运行了一段时间回到最初的状态，但是内存没有减少），我们需要通过WinDbg找到是什么类出现了问题。切换到WinDbg，在菜单“Debug”中找到“Break”点击中断程序：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image010.png"><img loading="lazy" decoding="async" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image010" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image010_thumb.png" alt="clip_image010" width="244" height="128" border="0" /></a></p>
<p>输入“!dumpheap –type WindowsFormsApplication3”罗列出我们程序的所有类实例：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image012.jpg"><img loading="lazy" decoding="async" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image012" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image012_thumb.jpg" alt="clip_image012" width="244" height="183" border="0" /></a></p>
<p>MT与类型的概念差不多，只要类型一样，这个MT地址就一样，红色的方框中可以看到有两种，一种是1个，另外一种是10个，与Statistics中的内容一致。</p>
<p>理论上来说，所有的Form1都已经关闭了，应该不存在这样的对象，有些人可能觉得是垃圾回收器还没来得及回收的缘故，我们可以做一个实验，修改程序，在工具栏中加一个按钮“Clear Memory”，并在Click事件中编写如下的代码：</p><pre class="urvanov-syntax-highlighter-plain-tag">private void toolStripButton1_Click(object sender, EventArgs e)
{
  GC.Collect();
}</pre><p>当关闭10个窗口之后点击此按钮，再在WinDbg中用dumpheap命令查看对象清单，发现它们依旧存在。</p>
<p>这说明垃圾回收器并没有回收它们，.NET中的垃圾回收器只会回收没有被使用的对象，所以这些Form1对象依旧被使用，那是谁在使用它们呢，我们可以通过查看其中一个对象实例的引用列表来找到源头：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image014.jpg"><img loading="lazy" decoding="async" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image014" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image014_thumb.jpg" alt="clip_image014" width="405" height="246" border="0" /></a></p>
<p>比如看其中一个地址为“01f78160”的对象引用，使用下面的命令：</p>
<div id="codeSnippetWrapper">
<pre class="urvanov-syntax-highlighter-plain-tag">!gcroot 01f78160</pre>
</div>
<p>（注意每台机器上地址不同）下面长的方框中是某一个引用的路径，箭头最终指向是Form1。后面绿色和粉色的根是一个Weak引用，这个对垃圾回收器没有影响。而红色方框的根为“HANDLE(Pinned)”，这表示一个正在使用的对象，后面看到类型是System.Object[]，可能是个数组，也可能是静态变量，因为.NET运行时中所有静态变量都是用Object[]存储的，它的第二级是一个List&lt;Form&gt;类型的，从这里就能找到问题的原因了。</p>
<h3>解决问题</h3>
<p>我们修改Form1的代码，添加窗口的Closing事件处理函数，修改为以下的代码：</p><pre class="urvanov-syntax-highlighter-plain-tag">private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
 DocumentEditorManager.DocumentEditors.Remove(this);
}</pre><p>这样在Form1关闭的时候就会从List中移除，这时候再重复上面的步骤，可以看到在使用dumpheap命令的时候已经与前面的情况不同了：</p>
<p><a href="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image016.jpg"><img loading="lazy" decoding="async" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="clip_image016" src="https://www.xiaomingtu.com/wp-content/uploads/2010/12/clip_image016_thumb.jpg" alt="clip_image016" width="327" height="202" border="0" /></a></p>
<p>从图中，我们可以看到，Form1还有一个对象存在，这是.NET内部机制引起的，每个MDI的窗口都有一个PropertyStore，用于优化性能，只有最后一个关闭的子对话框会被引用，所以它不会导致内存一直增长，这问题本来在.NET 2.0的时候没有的，但是.NET 2.0 SP1的时候为了修复另外一个问题导致这个问题出现了，详细的解释可以见<a href="http://memprofiler.com/articles/memleakintroducedin2.0sp1.aspx">这里</a>。</p>
<h3>总结</h3>
<p>SOS.DLL是一个强大的扩展，还有非常多的功能。各个命令也支持很多参数。也可以在VS的调试器中使用SOS.DLL，VS中进入调试模式之后，可以使用相同的命令.load sos.dll来加载SOS.DLL，但是个人感觉用起来不太顺，还是WinDbg中用起来比较顺畅。</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15278">使用WinDbg查找内存泄漏问题</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/15278/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>.Net 十大必备工具</title>
		<link>https://www.xiaomingtu.com/archives/10010?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=net-%25e5%258d%2581%25e5%25a4%25a7%25e5%25bf%2585%25e5%25a4%2587%25e5%25b7%25a5%25e5%2585%25b7</link>
					<comments>https://www.xiaomingtu.com/archives/10010#comments</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Wed, 08 Jul 2009 22:48:51 +0000</pubDate>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[专业技术]]></category>
		<category><![CDATA[桌面应用]]></category>
		<category><![CDATA[移动应用]]></category>
		<category><![CDATA[转载]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[工具]]></category>
		<guid isPermaLink="false">http://rextu.wordpress.com/2009/07/09/net-%e5%8d%81%e5%a4%a7%e5%bf%85%e5%a4%87%e5%b7%a5%e5%85%b7</guid>

					<description><![CDATA[<p>1. Snippet Compiler Snippet Compiler 是一个基于 Windows 的应用程序，可以通过它来编写、编译和运行代码。如果具有较小的代码段，并且不希望为其创建完整的Visual Studio .NET项目（及伴随该项目的所有文件），该工具将很有用。 2. Microsoft Source Analysis for C#（StyleCop） 微软内部的静态代码检查和代码强制格式美化工具StyleCop的4.2版本Microsoft Source Analysis for C# 。 SourceAnalysis 不是代码格式化工具，而是代码规范检查工具，它不仅检查代码格式，而是编码规范。 3. GhostDoc GhostDoc是Visual Studio的免费插件，可以编写XML格式的注释文档。C#中XML格式的文档注释好处：Visual Studio会显示这些注释内容，还有比如NDoc或微软的文档工具也可以用这些注释生成有良好外观的帮助文件。 4. Sandcastle Sandcastle。这是一个管理类库的文档编译器。它还可通过反射处理汇编源代码，并在代码中使用XML注释生成MSDN形式的文档，这种文档比难以解读的XML更易于理解。 5. Nunit NUnit是一个.NET上的单元测试框架。NUnit 1.x主要是移植JUnit 3.8。从2.0版本开始，NUnit进行了重写和重新设计，使用Attributes代替特定的方法和相应的基类。 6. MyGeneration MyGeneration是一个功能很强大的代码生成工具。通过编写各种类型脚本（C#,VB.Net,JScript,VBScript）的模板，通过数据库的表内容，生成你需要的各种代码。可以用它来生成ORM的实体类，存储过程，SQL语句等。 7. Reflector for .NET Reflector for .NET是一个面向 Microsoft .NET Framework 的免费类浏览器、分析器和DLL反编译器。 8. The Regulator the [&#8230;]</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/10010">.Net 十大必备工具</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div id="msgcns!1050226441EB0308!357" class="bvMsg">
<p>1. <span style="color: #ff0000;">Snippet Compiler</span><br />
Snippet Compiler 是一个基于 Windows 的应用程序，可以通过它来编写、编译和运行代码。如果具有较小的代码段，并且不希望为其创建完整的Visual Studio .NET项目（及伴随该项目的所有文件），该工具将很有用。</p>
<p>2. <span style="color: #ff0000;">Microsoft Source Analysis for C#（StyleCop）</span><br />
微软内部的静态代码检查和代码强制格式美化工具StyleCop的4.2版本Microsoft Source Analysis for C# 。 SourceAnalysis 不是代码格式化工具，而是代码规范检查工具，它不仅检查代码格式，而是编码规范。</p>
<p>3. <span style="color: #ff0000;">GhostDoc</span><br />
GhostDoc是Visual Studio的免费插件，可以编写XML格式的注释文档。C#中XML格式的文档注释好处：Visual Studio会显示这些注释内容，还有比如NDoc或微软的文档工具也可以用这些注释生成有良好外观的帮助文件。</p>
<p>4. <span style="color: #ff0000;">Sandcastle</span><br />
Sandcastle。这是一个管理类库的文档编译器。它还可通过反射处理汇编源代码，并在代码中使用XML注释生成MSDN形式的文档，这种文档比难以解读的XML更易于理解。</p>
<p>5. <span style="color: #ff0000;">Nunit<br />
</span>NUnit是一个.NET上的单元测试框架。NUnit 1.x主要是移植JUnit 3.8。从2.0版本开始，NUnit进行了重写和重新设计，使用Attributes代替特定的方法和相应的基类。<span id="more-10010"></span></p>
<p>6. <span style="color: #ff0000;">MyGeneration</span><br />
MyGeneration是一个功能很强大的代码生成工具。通过编写各种类型脚本（C#,VB.Net,JScript,VBScript）的模板，通过数据库的表内容，生成你需要的各种代码。可以用它来生成ORM的实体类，存储过程，SQL语句等。</p>
<p>7. <span style="color: #ff0000;">Reflector for .NET</span><br />
Reflector for .NET是一个面向 Microsoft .NET Framework 的免费类浏览器、分析器和DLL反编译器。</p>
<p>8. <span style="color: #ff0000;">The Regulator</span><br />
the regulator是很有特色的工具，能使生成和测试正则表达式变得容易。它们在.NET 框架中受到支持。</p>
<p>9. <span style="color: #ff0000;">LINQPad</span><br />
LINQ是Language Integrated Query的简称，是集成在.NET编程语言的特性,是编程语言的一个组成部分。</p>
<p>10. <span style="color: #ff0000;">NAnt</span><br />
NAnt是基于.NET的生成工具，与版本Visual Studio.NET 不同，它使得你的项目创建生成过程变得容易。</p>
<p>这里就不给出下载地址了，Google一下一般第一条就是。</p>
</div>
<p>The post <a href="https://www.xiaomingtu.com/archives/10010">.Net 十大必备工具</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/10010/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>基于SharePoint Server 2007开发工作流-开发环境搭建</title>
		<link>https://www.xiaomingtu.com/archives/15400?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ouousharepoint-server-2007ca-ci</link>
					<comments>https://www.xiaomingtu.com/archives/15400#respond</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Fri, 27 Jun 2008 12:41:00 +0000</pubDate>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[专业技术]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Sharepoint]]></category>
		<guid isPermaLink="false">http://blog.csdn.net/al2ping/article/details/2591420</guid>

					<description><![CDATA[<p>注意：本文提到的环境搭建仅作为开发使用，切勿以此搭建您的发布服务器。 在你开始搭建环境之前，请确保你对要做的事情有所了解，对所采用的技术有所了解。 下表列出了所需要的软件： 软件 版本 备注 Windows Server 2003，安装SP1或者更高 Windows SharePoint Services 2007 核心组件，当你安装MOSS的时候会自动安装。如果你安装了MOSS就不需要安装这个了。 Microsoft Office SharePoint Server(MOSS) 2007 SharePoint服务器，包括表单服务。如果你安装了这个，就不需要另外安装WSS。 .NET Framework 2.0 主要的.NET运行时和开发组件，这是安装3.0 Framework的基础。 .NET Framework 3.0 提供了Windows Workflow Foundations. Visual Studio 2005 开发环境。 SQL Server 2005 Express 安装MOSS时需要。 Workflow Extensions for Visual Studio 2005 Visual Studio的Workflow扩展，包含一个Workflow Designer以及支持库。 Office client applications 2007 包括SharePoint Designer（可视化工作流设计，VS扩展也有同样的功能）, [&#8230;]</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15400">基于SharePoint Server 2007开发工作流-开发环境搭建</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div><span style="font-weight: bold;"><span style="font-style: italic;"><span style="color: #4f81bd;"><span style="font-family: 宋体;">注意：本文提到的环境搭建仅作为开发使用，切勿以此搭建您的发布服务器。</span></span></span></span></div>
<div></div>
<div><em><span style="font-family: 宋体;">在你开始搭建环境之前，请确保你对要做的事情有所了解，对所采用的技术有所了解。</span></em></div>
<div></div>
<div><strong><span style="font-family: 宋体;">下表列出了所需要的软件：<span id="more-15400"></span></span></strong></div>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #9bbb59; border-top: #b3cc82 1pt solid; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="color: white; font-family: 宋体;">软件</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #9bbb59; border-top: #b3cc82 1pt solid; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="color: white; font-family: 宋体;">版本</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #9bbb59; border-top: #b3cc82 1pt solid; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="color: white; font-family: 宋体;">备注</span></strong></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Windows Server</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2003</span><span style="font-family: 宋体;">，安装</span><span style="font-family: Calibri;">SP1</span><span style="font-family: 宋体;">或者更高</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189"></td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Windows SharePoint Services</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2007</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">核心组件，当你安装</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">的时候会自动安装。如果你安装了</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">就不需要安装这个了。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Microsoft Office SharePoint Server(MOSS)</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2007</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">SharePoint</span><span style="font-family: 宋体;">服务器，包括表单服务。如果你安装了这个，就不需要另外安装</span><span style="font-family: Calibri;">WSS</span><span style="font-family: 宋体;">。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">.NET Framework</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2.0</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">主要的</span><span style="font-family: Calibri;">.NET</span><span style="font-family: 宋体;">运行时和开发组件，这是安装</span><span style="font-family: Calibri;">3.0 Framework</span><span style="font-family: 宋体;">的基础。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">.NET Framework</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">3.0</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">提供了</span><span style="font-family: Calibri;">Windows Workflow Foundations.</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Visual Studio</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2005</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">开发环境。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">SQL Server</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2005 Express</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">时需要。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Workflow Extensions for Visual Studio 2005</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189"></td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">Visual Studio</span><span style="font-family: 宋体;">的</span><span style="font-family: Calibri;">Workflow</span><span style="font-family: 宋体;">扩展，包含一个</span><span style="font-family: Calibri;">Workflow Designer</span><span style="font-family: 宋体;">以及支持库。</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">Office client applications</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: Calibri;">2007</span></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">包括</span><span style="font-family: Calibri;">SharePoint Designer</span><span style="font-family: 宋体;">（可视化工作流设计，</span><span style="font-family: Calibri;">VS</span><span style="font-family: 宋体;">扩展也有同样的功能）</span><span style="font-family: Calibri;">, Word, Excel, InfoPath</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189">
<div><strong><span style="font-family: Calibri;">WSS and MOSS SDKs</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="189"></td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 142.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="189">
<div><span style="font-family: 宋体;">参考资料</span><span style="font-family: Calibri;">,</span><span style="font-family: 宋体;">包含一些示例</span></div>
</td>
</tr>
</tbody>
</table>
<div></div>
<div style="text-indent: 21.2pt;"><span style="font-family: 宋体;">因为安装</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">时需要</span><span style="font-family: Calibri;">SQL Server 2005</span><span style="font-family: 宋体;">或者</span><span style="font-family: Calibri;">SQL Server 2000 SP3</span><span style="font-family: 宋体;">或更高，作为我们的开发环境，一般就安装</span><span style="font-family: Calibri;">SQL Server 2005 Express</span><span style="font-family: 宋体;">版本。在你安装</span><span style="font-family: Calibri;">VS2005</span><span style="font-family: 宋体;">的时候可以选择安装</span><span style="font-family: Calibri;">SQL Server 2005 Express Edition</span><span style="font-family: 宋体;">，但是最好是让</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">安装包来安装</span><span style="font-family: Calibri;">SQL Server 2005 Express Edition</span><span style="font-family: 宋体;">，不要让</span><span style="font-family: Calibri;">VS</span><span style="font-family: 宋体;">安装包安装。</span></div>
<div style="text-indent: 21.2pt;"></div>
<div><strong><span style="font-family: 宋体;">安装注意事项：</span></strong></div>
<table style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #9bbb59; border-top: #b3cc82 1pt solid; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="color: white; font-family: 宋体;">组件</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #9bbb59; border-top: #b3cc82 1pt solid; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="color: white; font-family: 宋体;">描述</span></strong></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="font-family: Calibri;">Windows Server 2003</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">使用</span><span style="font-family: Calibri;">NTFS</span><span style="font-family: 宋体;">文件系统</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong> </strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">需要安装</span><span style="font-family: Calibri;">IIS</span><span style="font-family: 宋体;">和</span><span style="font-family: Calibri;">ASP.NET 2.0</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="font-family: Calibri;">Web Server</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">在</span><span style="font-family: Calibri;">IIS</span><span style="font-family: 宋体;">上启用</span><span style="font-family: Calibri;">ASP.NET 2.0</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong> </strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">运行在</span><span style="font-family: Calibri;">worker process isolation</span><span style="font-family: 宋体;">模式</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="font-family: Calibri;">Email</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">在服务器上配置邮件服务器</span><span style="font-family: Calibri;">, SMTP,POP3</span><span style="font-family: 宋体;">组件</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="font-family: Calibri;">User Account</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; background-color: transparent; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">创建多个用户帐号供测试用</span></div>
</td>
</tr>
<tr>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #b3cc82 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #d4d0c8; padding-top: 0cm;" valign="top" width="284">
<div><strong><span style="font-family: Calibri;">Visual Studio</span></strong></div>
</td>
<td style="border-bottom: #b3cc82 1pt solid; border-left: #d4d0c8; padding-bottom: 0cm; padding-left: 5.4pt; width: 213.05pt; padding-right: 5.4pt; background: #e6eed5; border-top: #d4d0c8; border-right: #b3cc82 1pt solid; padding-top: 0cm;" valign="top" width="284">
<div><span style="font-family: 宋体;">不要安装</span><span style="font-family: Calibri;">SQL Express</span></div>
</td>
</tr>
</tbody>
</table>
<div></div>
<div><strong><span style="font-family: 宋体;">安装步骤：</span></strong></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">1.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">安装配置</span><span style="font-family: Calibri;">Windows Server 2003</span><span style="font-family: 宋体;">，使用</span><span style="font-family: Calibri;">NTFS</span><span style="font-family: 宋体;">文件系统，安装</span><span style="font-family: Calibri;">Email(POP3,SMTP)</span><span style="font-family: 宋体;">和</span><span style="font-family: Calibri;">Web Server</span><span style="font-family: 宋体;">组件</span><span style="font-family: Calibri;">(IIS, ASP.NET2.0)</span><span style="font-family: 宋体;">。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">2.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">在</span><span style="font-family: Calibri;">IIS</span><span style="font-family: 宋体;">上启用</span><span style="font-family: Calibri;">ASP.NET</span><span style="font-family: 宋体;">（</span><span style="font-family: Calibri;">aspnet_regiis.exe -i</span><span style="font-family: 宋体;">）。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">3.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">保证</span><span style="font-family: Calibri;">IIS</span><span style="font-family: 宋体;">运行在</span><span style="font-family: Calibri;">worker process isolation</span><span style="font-family: 宋体;">模式。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">4.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">创建测试用户。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">5.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">.NET Framework</span><span style="font-family: 宋体;">（</span><span style="font-family: Calibri;">2.0</span><span style="font-family: 宋体;">和</span><span style="font-family: Calibri;">3.0</span><span style="font-family: 宋体;">）。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">6.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">或者</span><span style="font-family: Calibri;">WSS v3</span><span style="font-family: 宋体;">。安装类型选择</span><span style="font-family: Calibri;">Basic</span><span style="font-family: 宋体;">。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">7.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">运行</span><span style="font-family: Calibri;">SharePoint Configuration Wizard</span><span style="font-family: 宋体;">配置环境。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">8.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">VS2005</span><span style="font-family: 宋体;">。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">9.</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">Office 2007</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">10.</span><span style="font: 7pt 'Times New Roman';">     </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">Workflow Extensions for Visual Studio 2005</span><span style="font-family: 宋体;">。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">11.</span><span style="font: 7pt 'Times New Roman';">     </span></span><span style="font-family: 宋体;">安装</span><span style="font-family: Calibri;">SDK</span><span style="font-family: 宋体;">以及其他一些你觉得需要的东西。</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">12.</span><span style="font: 7pt 'Times New Roman';">     </span></span><span style="font-family: 宋体;">通过</span><span style="font-family: Calibri;">Central Administration</span><span style="font-family: 宋体;">配置</span><span style="font-family: Calibri;">MOSS</span><span style="font-family: 宋体;">和</span><span style="font-family: Calibri;">WSS</span><span style="font-family: 宋体;">：</span></div>
<div style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">a)</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">配置系统的邮箱地址。</span></div>
<div style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">b)</span><span style="font: 7pt 'Times New Roman';">         </span></span><span style="font-family: 宋体;">工作流设置——全部</span><span style="font-family: Calibri;">Yes</span></div>
<div></div>
<div><span style="font-family: 宋体;">环境搭建到此结束，写的不是很细致，基本够用了，</span><span style="font-family: Calibri;">Good luck!</span></div>
<div></div>
<div><span style="font-size: 16pt; font-family: 黑体;">参考资料</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">[1].</span><span style="font: 7pt 'Times New Roman';">     </span></span><span style="font-family: Calibri;">David Mann, </span><span style="font-family: 宋体;">《</span><span style="font-family: Calibri;">Workflow in the 2007 Microsoft Office System</span><span style="font-family: 宋体;">》</span><span style="font-family: Calibri;">, APress, 2007</span></div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;"><span><span style="font-family: Calibri;">[2].</span><span style="font: 7pt 'Times New Roman';">     </span></span><span style="font-family: Calibri;">http://www.kcdholdings.com</span></div>
<p>The post <a href="https://www.xiaomingtu.com/archives/15400">基于SharePoint Server 2007开发工作流-开发环境搭建</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/15400/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>关于.NET里面ContextSwitchDeadlock异常</title>
		<link>https://www.xiaomingtu.com/archives/15396?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ooou-netaiaaecontextswitchdeadlockoi</link>
					<comments>https://www.xiaomingtu.com/archives/15396#comments</comments>
		
		<dc:creator><![CDATA[Xiaoming]]></dc:creator>
		<pubDate>Sun, 26 Aug 2007 22:41:00 +0000</pubDate>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[专业技术]]></category>
		<category><![CDATA[开发语言]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[桌面应用]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[WebForm]]></category>
		<category><![CDATA[WinForm]]></category>
		<guid isPermaLink="false">http://blog.csdn.net/al2ping/article/details/1759898</guid>

					<description><![CDATA[<p>问题背景 最近在做一个反应速度测试软件，是用C#写的，刚开始是觉得是个小工具，随便做做就可以了，结果是越做越复杂，本来打算一到两个星期就可以做完的，结果是做了两个月，当然这期间还有其他事情在做的。 问题出现 在软件中需要一个功能，就是随机生成一个长度为120的数字序列，要求是： 1.          每个数字都是1、2、3、4这四个数中的一个； 2.          前后两个数不能重复； 3.          每个数（1、2、3、4）各30个，一共120个。 我自己写了个算法，具体思路是这样的：循环120次，每次随机产生个数，然后判断这个数已经生成了多少次了，如果超过了30个或者跟前个数字重复，就重新随机产生。 进入调试之后，每次到循环这里，貌似都是循环到80次左右的时候就会出现ContextSwitchDeadlock异常，然而有时候又不会的。 郁闷一个星期… 问题解决 我差了很多资料，网上很多关于这个异常的都是说怎么会关闭掉，只要在VS里面，“调试”“异常”“Managed Debugging Assistant”下，将这个异常的勾去掉就不会再出现了。 出现是不出现了，但问题是程序到这里下不去了，屏蔽掉也没有用。 在MSDN里面，对这个异常的解释是： 如果在试图进行 COM 上下文转换期间检测到一个死锁，则将激活 ContextSwitchDeadlock 托管调试助手 (MDA)。 症状 最常见的症状是：从托管代码对非托管 COM 组件的调用未返回任何结果。另一个症状是内存使用量与时俱增。 原因 原因很可能是单线程单元 (STA) 线程不发送消息。STA 线程或者等待而且不发送消息，或者执行一个长时间的操作而且不允许发送消息队列。 内存使用与时俱增的原因是：终结器线程试图对非托管 COM 组件调用 release 而该组件未返回任何结果。这会阻止终结器回收其他对象。 解决办法 遵循有关 STA 消息发送的 COM 规则。 对运行库的影响 此 MDA 对 CLR 无任何影响。它只报告有关 COM 上下文的数据。 输出 一条描述当前上下文和目标上下文的消息。 [&#8230;]</p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15396">关于.NET里面ContextSwitchDeadlock异常</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="MsoNormal" style="margin: 12pt 0cm 3.2pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 9;" align="left"><span style="font-size: 12pt; font-family: 黑体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">问题背景</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">最近在做一个反应速度测试软件，是用</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">C#</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">写的，刚开始是觉得是个小工具，随便做做就可以了，结果是越做越复杂，本来打算一到两个星期就可以做完的，结果是做了两个月，当然这期间还有其他事情在做的。</span></p>
<p class="MsoNormal" style="margin: 12pt 0cm 3.2pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 9;" align="left"><span style="font-size: 12pt; font-family: 黑体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">问题出现</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">在软件中需要一个功能，就是随机生成一个长度为</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">120</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的数字序列，要求是：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt; text-align: left; mso-pagination: widow-orphan; tab-stops: list 39.0pt;" align="left"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">1.</span><span style="font-size: 7pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">          </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">每个数字都是</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">4</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">这四个数中的一个；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt; text-align: left; mso-pagination: widow-orphan; tab-stops: list 39.0pt;" align="left"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">2.</span><span style="font-size: 7pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">          </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">前后两个数不能重复；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 39pt; text-indent: -21pt; text-align: left; mso-pagination: widow-orphan; tab-stops: list 39.0pt;" align="left"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">3.</span><span style="font-size: 7pt; mso-font-kerning: 0pt; mso-fareast-font-family: 'Times New Roman';" lang="EN-US">          </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">每个数（</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">4</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">）各</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">个，一共</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">120</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">个。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">我自己写了个算法，具体思路是这样的：循环</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">120</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">次，每次随机产生个数，然后判断这个数已经生成了多少次了，如果超过了</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">个或者跟前个数字重复，就重新随机产生。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">进入调试之后，每次到循环这里，貌似都是循环到</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">80</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">次左右的时候就会出现</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">ContextSwitchDeadlock</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">异常，然而有时候又不会的。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">郁闷一个星期</span><span style="font-family: Times New Roman;"><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US">…</span></span></p>
<p class="MsoNormal" style="margin: 12pt 0cm 3.2pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 9;" align="left"><span style="font-size: 12pt; font-family: 黑体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">问题解决<span id="more-15396"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">我差了很多资料，网上很多关于这个异常的都是说怎么会关闭掉，只要在</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">VS</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">里面，“调试”“异常”“</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">Managed Debugging Assistant</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">”下，将这个异常的勾去掉就不会再出现了。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">出现是不出现了，但问题是程序到这里下不去了，屏蔽掉也没有用。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">在</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">MSDN</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">里面，对这个异常的解释是：</span></p>
<div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;" align="center">
<hr align="center" size="2" width="100%" />
</div>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">如果在试图进行</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> COM </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">上下文转换期间检测到一个死锁，则将激活</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> ContextSwitchDeadlock </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">托管调试助手</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> (MDA)</span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">。</span></p>
<p class="MsoNormal" style="margin: 13.5pt 0cm 6pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1;" align="left"><strong><span style="font-size: 11pt; color: #003399; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 18.0pt;">症状</span></strong></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">最常见的症状是：从托管代码对非托管</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> COM </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">组件的调用未返回任何结果。另一个症状是内存使用量与时俱增。</span></p>
<p class="MsoNormal" style="margin: 13.5pt 0cm 6pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1;" align="left"><strong><span style="font-size: 11pt; color: #003399; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 18.0pt;">原因</span></strong></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">原因很可能是单线程单元</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> (STA) </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">线程不发送消息。</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">STA </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">线程或者等待而且不发送消息，或者执行一个长时间的操作而且不允许发送消息队列。</span></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">内存使用与时俱增的原因是：终结器线程试图对非托管</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> COM </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">组件调用</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> release </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">而该组件未返回任何结果。这会阻止终结器回收其他对象。</span></p>
<p class="MsoNormal" style="margin: 13.5pt 0cm 6pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1;" align="left"><strong><span style="font-size: 11pt; color: #003399; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 18.0pt;">解决办法</span></strong></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">遵循有关</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> STA </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">消息发送的</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> COM </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">规则。</span></p>
<p class="MsoNormal" style="margin: 13.5pt 0cm 6pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1;" align="left"><strong><span style="font-size: 11pt; color: #003399; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 18.0pt;">对运行库的影响</span></strong></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">此</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> MDA </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">对</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> CLR </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">无任何影响。它只报告有关</span><span style="font-size: 10pt; color: black; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;"> COM </span></span><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">上下文的数据。</span></p>
<p class="MsoNormal" style="margin: 13.5pt 0cm 6pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1;" align="left"><strong><span style="font-size: 11pt; color: #003399; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 18.0pt;">输出</span></strong></p>
<p class="MsoNormal" style="margin: 7.5pt 0cm 3.75pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt;">一条描述当前上下文和目标上下文的消息。</span></p>
<div class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center; mso-pagination: widow-orphan;" align="center">
<hr align="center" size="2" width="100%" />
</div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-family: Times New Roman;"><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">还查了些其他的资料，得出的结论是</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">.NET</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">下强制转换需要很大的性能（因为才我的程序里面，得到的数字序列还要转换为枚举类型），所以造成溢出呀什么的，以为没的救了，就放弃了，跟“客户”商量了一下，用别的办法了。但是后来又要求这个一定要实现了，就请教了一位老师，他看完我的算法后知道了是我的算法问题，具体描述一下：<span style="color: red;">当我生成了</span></span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">119</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">个数字之后，比如</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">1</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">2</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">3</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">都已经</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">30</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">个，这样最后一个数字只能是</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">4</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">了，然而如果倒数第二个数字正好也是</span><span style="font-size: 9pt; color: red; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">4</span></span><span style="font-size: 9pt; color: red; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的话，这里就会出现死循环了</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">。后来经过调试，发现果然是这个原因，原来不是死锁，而是死循环。哎</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">…</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">！惨败啊！</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">所以，这里得出的另一个结论是，造成</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">ContextSwitchDeadlock</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">异常的又一原因是死循环。简简单单的原因，</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">MSDN</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">解释的这么复杂（对我而言），不过也有可能是</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">MS</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">没有把这个写出来，也就是</span><span style="font-size: 9pt; mso-font-kerning: 0pt;" lang="EN-US"><span style="font-family: Times New Roman;">MSDN</span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的解释和死循环根本没关系。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-pagination: widow-orphan;" align="left"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">总之，希望这个对大家有所帮助吧，下面也贴一下老师帮我写另一个算法。仅供参考。</span></p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">          </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;">[] Randomlist()</span></div>
</div>
<p><img decoding="async" id="_54_2212_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img decoding="async" id="_54_2212_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" />          <span id="_54_2212_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_54_2212_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             Random ro <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Random();</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">int</span><span style="color: #000000;">[] Resultlist </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;">[</span><span style="color: #000000;">120</span><span style="color: #000000;">];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">int</span><span style="color: #000000;">[] KeyNumber </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;">[</span><span style="color: #000000;">4</span><span style="color: #000000;">];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">int</span><span style="color: #000000;"> i,j,r,s,flg;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">for</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">120</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_260_311_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_260_311_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />              <span id="_260_311_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_260_311_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                 Resultlist[i]<span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />             }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">4</span><span style="color: #000000;">; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_366_416_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_366_416_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />              <span id="_366_416_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_366_416_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                 KeyNumber[i] <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />             }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">30</span><span style="color: #000000;">; i</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_472_1146_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_472_1146_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />              <span id="_472_1146_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_472_1146_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                 <span style="color: #0000ff;">for</span><span style="color: #000000;"> (j </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; j </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> </span><span style="color: #000000;">4</span><span style="color: #000000;">; )</span></p>
<p><img decoding="async" id="_532_1128_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_532_1128_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                  <span id="_532_1128_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_532_1128_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     r <span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)ro.Next(</span><span style="color: #000000;">4</span><span style="color: #000000;">);</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     flg <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (j </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_660_887_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_660_887_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                      <span id="_660_887_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_660_887_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         <span style="color: #0000ff;">for</span><span style="color: #000000;"> (s </span><span style="color: #000000;">=</span><span style="color: #000000;"> j</span><span style="color: #000000;">&#8211;</span><span style="color: #000000;">1</span><span style="color: #000000;">; s </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; s</span><span style="color: #000000;">&#8212;</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_740_864_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_740_864_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                          <span id="_740_864_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_740_864_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                             <span style="color: #0000ff;">if</span><span style="color: #000000;"> (r</span><span style="color: #000000;">==</span><span style="color: #000000;"> (KeyNumber[s]</span><span style="color: #000000;">&#8211;</span><span style="color: #000000;">1</span><span style="color: #000000;">))</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                                 flg <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                         }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                     }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (flg </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_946_1109_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_946_1109_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                      <span id="_946_1109_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_946_1109_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         KeyNumber[j] <span style="color: #000000;">=</span><span style="color: #000000;"> r </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         Resultlist[i <span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">4</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> j] </span><span style="color: #000000;">=</span><span style="color: #000000;"> KeyNumber[j];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         j<span style="color: #000000;">++</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                     }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                 }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />             }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">for</span><span style="color: #000000;"> ( i</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">120</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_1198_1643_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1198_1643_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />              <span id="_1198_1643_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1198_1643_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                 <span style="color: #0000ff;">if</span><span style="color: #000000;"> (Resultlist[i </span><span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">] </span><span style="color: #000000;">==</span><span style="color: #000000;"> Resultlist[i])</span></p>
<p><img decoding="async" id="_1275_1628_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1275_1628_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                  <span id="_1275_1628_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1275_1628_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">for</span><span style="color: #000000;">(j</span><span style="color: #000000;">=</span><span style="color: #000000;">i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">;j</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">120</span><span style="color: #000000;">;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         <span style="color: #0000ff;">if</span><span style="color: #000000;"> (Resultlist[j] </span><span style="color: #000000;">!=</span><span style="color: #000000;"> Resultlist[i]) </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">if</span><span style="color: #000000;">(j</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">120</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_1440_1607_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1440_1607_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                      <span id="_1440_1607_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1440_1607_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         r <span style="color: #000000;">=</span><span style="color: #000000;"> Resultlist[i];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         Resultlist[i] <span style="color: #000000;">=</span><span style="color: #000000;"> Resultlist[j];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         Resultlist[j] <span style="color: #000000;">=</span><span style="color: #000000;"> r;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                     }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                 }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />             }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">for</span><span style="color: #000000;"> ( i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">119</span><span style="color: #000000;">; i </span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">; i</span><span style="color: #000000;">&#8212;</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_1701_2167_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1701_2167_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />              <span id="_1701_2167_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1701_2167_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                 <span style="color: #0000ff;">if</span><span style="color: #000000;"> (Resultlist[i] </span><span style="color: #000000;">==</span><span style="color: #000000;"> Resultlist[i </span><span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">])</span></p>
<p><img decoding="async" id="_1778_2152_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1778_2152_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                  <span id="_1778_2152_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1778_2152_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">for</span><span style="color: #000000;"> ( j </span><span style="color: #000000;">=</span><span style="color: #000000;"> i </span><span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">; j </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; j</span><span style="color: #000000;">&#8212;</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         <span style="color: #0000ff;">if</span><span style="color: #000000;"> (Resultlist[j] </span><span style="color: #000000;">!=</span><span style="color: #000000;"> Resultlist[i </span><span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">]) </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                     <span style="color: #0000ff;">if</span><span style="color: #000000;"> (j </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)</span></p>
<p><img decoding="async" id="_1958_2133_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img decoding="async" id="_1958_2133_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />                      <span id="_1958_2133_Closed_Text" style="display: none; background-color: #ffffff; border: #808080 1px solid;">&#8230;</span><span id="_1958_2133_Open_Text"><span style="color: #000000;">{</span></span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         r <span style="color: #000000;">=</span><span style="color: #000000;"> Resultlist[i </span><span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         Resultlist[i <span style="color: #000000;">&#8211;</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span><span style="color: #000000;"> Resultlist[j];</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />                         Resultlist[j] <span style="color: #000000;">=</span><span style="color: #000000;"> r;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                     }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />                 }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />             }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />             <span style="color: #0000ff;">return</span><span style="color: #000000;"> Resultlist;</span></p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />         }</p>
<p><img decoding="async" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></p>
<p>The post <a href="https://www.xiaomingtu.com/archives/15396">关于.NET里面ContextSwitchDeadlock异常</a> appeared first on <a href="https://www.xiaomingtu.com">Xiaoming Tu - Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.xiaomingtu.com/archives/15396/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
