<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Web.网际浪人.Blog</title><subtitle type="text">【没有最完美的解决方案，只有最适合的解决方案——Karl He】</subtitle><id>http://feed.cnblogs.com/blog/u/16188/rss</id><updated>2012-03-03T15:41:26Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/16188/rss"/><entry><id>http://www.cnblogs.com/heekui/archive/2012/03/03/2378813.html</id><title type="text">.Net Framework 4.0 中利用Task实现并行处理、串并行混合处理</title><summary type="text">我们常常会遇到需要利用并行处理，尽量发挥多核或多CPU的潜能，提高程序运行效率的场景。在.NET环境下，常用的做法是使用Thread，多线程方式进行并行处理。但在.Net4.0中，微软提供一种新的概念——Task（任务），换句话说，并行处理由“多线程”进化为了“多任务”的方式。一、利用Task实现多任务处理测试1：以下为测试过程，模拟多次调用一耗时方法，分别使用串行、多线程方式、多任务方式：1、建立一虚拟耗时的方法 /// &lt;summary&gt; /// 模拟执行耗时的方法 /// &lt;/summary&gt; public static void...</summary><published>2012-03-03T15:23:00Z</published><updated>2012-03-03T15:23:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2012/03/03/2378813.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2012/03/03/2378813.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们常常会遇到需要利用并行处理，尽量发挥多核或多CPU的潜能，提高程序运行效率的场景。在.NET环境下，常用的做法是使用Thread，多线程方式进行并行处理。但在.Net4.0中，微软提供一种新的概念&amp;mdash;&amp;mdash;Task（任务），换句话说，并行处理由&amp;ldquo;多线程&amp;rdquo;进化为了&amp;ldquo;多任务&amp;rdquo;的方式。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一、利用Task实现多任务处理&lt;/p&gt;&lt;p&gt;测试1：&lt;/p&gt;&lt;p&gt;以下为测试过程，模拟多次调用一耗时方法，分别使用串行、多线程方式、多任务方式：&lt;/p&gt;&lt;p&gt;1、建立一虚拟耗时的方法&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 模拟执行耗时的方法&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestLongTimeMethod()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;method start:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + System.DateTime.Now.ToString());&lt;br /&gt;            System.Threading.Thread.Sleep(&lt;span style="color: #800080;"&gt;5000&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;method end:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + System.DateTime.Now.ToString());&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2、传统串行调用方式、多线程调用、多任务调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 传统串行方式&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 传统串行方式&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; lineMethod()&lt;br /&gt;        {&lt;br /&gt;            TestLongTimeMethod();&lt;br /&gt;            TestLongTimeMethod();&lt;br /&gt;            TestLongTimeMethod();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 多线程方式&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 多线程方式&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; threadMethod()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; thread1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(() =&amp;gt; TestLongTimeMethod());&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; thread2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(() =&amp;gt; TestLongTimeMethod());&lt;br /&gt;            thread1.Start();&lt;br /&gt;            thread2.Start();&lt;br /&gt;            TestLongTimeMethod();&lt;br /&gt;            thread1.Join();          &lt;br /&gt;            thread2.Join();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 多任务方式&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 多任务方式&amp;mdash;&amp;mdash;线程池中，委托给CPU，全部执行完后再跳出线程池&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; taskMethod()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 方式1：使用Parallel.Invoke,可同时并行多个任务，任务调用的方法可以不同&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Parallel.Invoke(&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    () =&amp;gt; TestLongTimeMethod(),&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    () =&amp;gt; TestLongTimeMethod(),&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    () =&amp;gt; TestLongTimeMethod()&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 方式2:使用Parallel.For,可设定并行多个任务，任务调用的方法相同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; times = &lt;span style="color: #800080;"&gt;3&lt;/span&gt;;&lt;br /&gt;            Parallel.For(&lt;br /&gt;                &lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&lt;br /&gt;                times,&lt;br /&gt;                i =&amp;gt; TestLongTimeMethod()&lt;br /&gt;            );&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3、模拟执行过程，统计过程用时&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 101.11%; height: 1017px;"&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; maxTimes = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            DateTime ds = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;            DateTime de = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;            DateTime ds1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;            DateTime de1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;            DateTime ds2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;            DateTime de2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DateTime();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; lineMethod 串行&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************【串  行】**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            ds = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[StartTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + ds.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; intLoop = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; intLoop &amp;lt; maxTimes; intLoop++)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (intLoop + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;).ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                lineMethod();&lt;br /&gt;            }&lt;br /&gt;            de = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[EndTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + de.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            System.Threading.Thread.Sleep(&lt;span style="color: #800080;"&gt;500&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;            &lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; threadMethod 多线程&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************【多线程】**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            ds1 = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[StartTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + ds1.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; intLoop = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; intLoop &amp;lt; maxTimes; intLoop++)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (intLoop + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;).ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                threadMethod();&lt;br /&gt;            }&lt;br /&gt;            de1 = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[EndTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + de1.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            System.Threading.Thread.Sleep(&lt;span style="color: #800080;"&gt;500&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; taskMethod 多任务&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************【多任务】**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            ds2 = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[StartTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + ds2.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; intLoop = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; intLoop &amp;lt; maxTimes; intLoop++)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (intLoop + &lt;span style="color: #800080;"&gt;1&lt;/span&gt;).ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;                taskMethod();&lt;br /&gt;            }&lt;br /&gt;            de2 = DateTime.Now;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;**************[EndTime:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + de2.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;]**************&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            System.Threading.Thread.Sleep(&lt;span style="color: #800080;"&gt;500&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;lineMethod  【串  行】   : &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (de - ds).TotalMilliseconds.ToString());&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;threadMethod【多线程】   : &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (de1 - ds1).TotalMilliseconds.ToString());&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;taskMethod  【多任务】   : &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + (de2 - ds2).TotalMilliseconds.ToString());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;4、执行结果截图&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12631/2012030322582394.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;结论：从结果可以看出多线程或多任务的性能明显高于串行方式。多线程或多任务执行效率区别不大，.NET框架底层实现可能大致相同。但多任务的代码写法更为简洁，也更为灵活。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;二、利用Task实现并行、串行的执行顺序定义&lt;/p&gt;&lt;p&gt;测试2：:&lt;/p&gt;&lt;p&gt;1、假定A、B、C、D、E 多任务的执行顺序为：A、B 执行后，执行C，A&amp;nbsp;执行后，执行 D, B&amp;nbsp;执行后，执行 E&lt;br /&gt;执行时的测试方法如下（即执行时显示执行的名称，并按传入的时间参数，决定进程休眠的时间）：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; TestAction&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; _p;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; _actionName;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; TestAction(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; actionName, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; p)&lt;br /&gt;        {&lt;br /&gt;            _actionName = actionName;&lt;br /&gt;            _p = p;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Do()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(System.DateTime.Now.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; | 开始执行&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + _actionName);&lt;br /&gt;            Thread.Sleep(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TimeSpan(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, _p));&lt;br /&gt;            Console.WriteLine(System.DateTime.Now.ToString() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; | 执行完毕&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + _actionName);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;p&gt;2、测试方法（传统串行、串并行结合）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 假定各任务分别耗时为A(5秒)、B(5秒)、C(2秒)、D(1秒)、E(2秒)。则串行需用时5+5+2+1+2=15 秒，串并行结合(A、B -&amp;gt; C，A -&amp;gt; D,B -&amp;gt; E) 需用时 5+2 = 7 秒.&lt;/p&gt;&lt;p&gt;测试程序如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 按设计的顺序测试（同时考虑串行与并行）: A、B -&amp;gt; C，A -&amp;gt; D,B -&amp;gt; E&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SortTaskMethod()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;--------------[串行]--------------&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;)).Do();&lt;br /&gt;            (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;)).Do();&lt;br /&gt;            (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)).Do();&lt;br /&gt;            (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;D&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)).Do();&lt;br /&gt;            (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)).Do();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;--------------[多任务]--------------&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            TaskFactory factory = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TaskFactory();&lt;br /&gt;            Task a = factory.StartNew((&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;)).Do);&lt;br /&gt;            Task b = factory.StartNew((&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;B&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;)).Do);&lt;br /&gt;            Task c = factory.ContinueWhenAll(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Task[] { a, b }, ((preTasks) =&amp;gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)).Do()));&lt;br /&gt;            Task d = factory.ContinueWhenAll(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Task[] { a }, ((preTasks) =&amp;gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;D&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)).Do()));&lt;br /&gt;            Task e = factory.ContinueWhenAll(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Task[] { b }, ((preTasks) =&amp;gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;E&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)).Do()));&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;3、执行结果截图&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/12631/2012030323183255.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;结论：与测试预想结果一致&lt;/p&gt;&lt;p&gt;实现的关键代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="width: 97.6%; height: 150px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 声明并获取一个Task工厂实例&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;TaskFactory factory = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TaskFactory();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 利用工厂创建一个任务，并执行指定的方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Task a = factory.StartNew((&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;5&lt;/span&gt;)).Do); &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 利用工厂创建后续任务（根据前置任务），并执行指定的方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Task c = factory.ContinueWhenAll(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Task[] { a, b }, ((preTasks) =&amp;gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TestAction(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;C&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;2&lt;/span&gt;)).Do()));&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="color: #0000ff;"&gt;请注意以上使用工厂方式获得的任务实例，与之前介绍的Parallel.Invoke 方式，二者有很重要的区别：&lt;/span&gt;工厂方式获取任务实例后即分配给系统委托，不受当前调用的方法约束；但invoke方式，括号内部声明的多个任务，必须全部执行结束，才会跳出invoke，回到当前调用的方法中。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heekui/aggbug/2378813.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heekui/archive/2012/03/03/2378813.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2011/03/22/1991136.html</id><title type="text">C# Process调用应用程序失败时应注意的问题</title><summary type="text">C#中如果采用Process调用应用程序失败，请添加下列第一行，设置应用程序所在的路径</summary><published>2011-03-22T03:07:00Z</published><updated>2011-03-22T03:07:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2011/03/22/1991136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2011/03/22/1991136.html"/><content type="html">&lt;p&gt;&amp;nbsp;C#中如果采用Process调用应用程序失败，请添加下列第一行，设置应用程序所在的路径。&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;span style="color: red"&gt;&lt;strong&gt;Directory.SetCurrentDirectory(&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: red"&gt;&lt;strong&gt;[应用程序所在路径]&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: red"&gt;&lt;strong&gt;);&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Process process = new Process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.StartInfo.FileName = &lt;span style="color: #003300"&gt;&lt;strong&gt;[应用程序名称]&lt;/strong&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.StartInfo.Arguments = &lt;strong style="color: #003300"&gt;[调用参数]&lt;/strong&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.StartInfo.UseShellExecute = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.StartInfo.CreateNoWindow = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.Start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; process.WaitForExit();&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heekui/aggbug/1991136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heekui/archive/2011/03/22/1991136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2011/01/05/1926899.html</id><title type="text">程序员的幽默</title><summary type="text">1、客户端：一个IT经理走进一家拉面馆说：“你们需要客户端吗？” 老板说：“面一般是伙计端，忙的时候才需要客户端。”2、云计算：中国一留学生去美国打工的当过报童，不带计算器，习惯动作抬头望天时心算找零。顾客大为惊讶，纷纷掏出计算器验证，皆无误，也抬头望天，惊恐问：“云计算？”3、1k=1024：A：哥们，最近手头紧，借点钱吧？B：好啊，要多少？A：一千行不？B：咱俩谁跟谁！给你凑个整数，这有一千零二十四，拿去。4、GeForce：一直觉得NVIDIA应该把“GeForce“更名为“GeiForce”，中文翻译为“给力！”5、反括号：据说某俄国特工九死一生偷到了美国NASA太空火箭发射程序源代码</summary><published>2011-01-05T15:26:00Z</published><updated>2011-01-05T15:26:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2011/01/05/1926899.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2011/01/05/1926899.html"/><content type="html">&lt;div id="blogDetailDiv" style="font-size: 14px"&gt;&lt;p&gt;1、客户端：一个IT经理走进一家拉面馆说：&amp;#8220;你们需要客户端吗？&amp;#8221; 老板说：&amp;#8220;面一般是伙计端，忙的时候才需要客户端。&amp;#8221;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;2、云计算：中国一留学生去美国打工的当过报童，不带计算器，习惯动作抬头望天时心算找零。顾客大为惊讶，纷纷掏出计算器验证，皆无误，也抬头望天，惊恐问：&amp;#8220;云计算？&amp;#8221;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3、1k=1024：A：哥们，最近手头紧，借点钱吧？B：好啊，要多少？A：一千行不？B：咱俩谁跟谁！给你凑个整数，这有一千零二十四，拿去。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、GeForce：一直觉得NVIDIA应该把&amp;#8220;GeForce&amp;#8220;更名为&amp;#8220;GeiForce&amp;#8221;，中文翻译为&amp;#8220;给力！&amp;#8221;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;5、反括号：据说某俄国特工九死一生偷到了美国NASA太空火箭发射程序源代码的最后一页，结果代码是：&amp;#8220;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}&amp;#8221;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;6、IDE：A：为什么你的关键字会变蓝，我的没有? B：（看了一下，没来及说话）A：为什么我的字下面有波浪线，你的没有? B：你为什么开个Word来编程？&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/heekui/aggbug/1926899.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heekui/archive/2011/01/05/1926899.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2010/09/29/1838064.html</id><title type="text">To腾讯：强行收集用户个人隐私的行为不可饶恕</title><summary type="text">今日，网上偶然看到360安全卫士提醒更新——“360隐私保护器”。 真是不用不知道，一用吓一跳，大家天天使用的腾讯QQ，居然是潜伏在我们电脑里的一个重大特务分子，幸好360将其揪了出来。先不论360安全卫士出于什么样的目的，商业竞争或者真为网民办实事，腾讯QQ这次小辫子真是被牢牢抓住了。 启动QQ五分钟以上时，果然如360所说，腾讯对非QQ程序之外的...</summary><published>2010-09-28T18:11:00Z</published><updated>2010-09-28T18:11:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2010/09/29/1838064.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2010/09/29/1838064.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 今日，网上偶然看到360安全卫士提醒更新&amp;#8212;&amp;#8212;&amp;#8220;360隐私保护器&amp;#8221;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 真是不用不知道，一用吓一跳，大家天天使用的腾讯QQ，居然是潜伏在我们电脑里的一个重大特务分子，幸好360将其揪了出来。先不论360安全卫士出于什么样的目的，商业竞争或者真为网民办实事，腾讯QQ这次小辫子真是被牢牢抓住了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 启动QQ五分钟以上时，果然如360所说，腾讯对非QQ程序之外的其他应用程序的监视开始了，主流的软件真是一个都没逃脱：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;即时聊天工具：MSN、飞信、Skype&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;视频：土豆、PPStream &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;文档：word、excel、ppt&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;压缩包：zip、rar&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 安全：360安全卫士&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 输入法：搜狗拼音&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;浏览器：傲游&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下载：迅雷、电骡&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#8230;&amp;#8230;（我本地安装的程序有限，QQ实际跟踪监视的软件应该更多）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;font color="#ff0000" size="6"&gt;&lt;span style="font-size: 14pt"&gt;QQ，你个聊天工具不安分守己做好自己的事，看我电脑里的其他程序是何居心？&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;诚然你现在是互联网公敌，在各个领域都有重量级的竞争对手，但你在我的电脑里看别人做事情干嘛呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果说查看你竞争对手的程序，可解释为：为自己同类型产品的用户体验改善而进行的一点小偷行为。但尤为重要的是：&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;&lt;span style="font-size: 14pt"&gt;对于俺办公类应用程序的监控，你的居心何在？为什么要看我的文件？这样做真是不可饶恕！！&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;你这样做的后果，只能是让长久以往培养出来的客户群失去对你的信赖，如果十几亿网民只要打开QQ干别的事情时，一举一动都处在你的严密监视之中，个人隐私或者商业机密如何保证？那大家应采取的方式只能是不使用QQ，改为其他即时通讯工具MSN或者SKYPE，虽然不及你本土化做得够，但人家基本的即时通讯功能没有丧失，只是没有你附加的那些花花草草的东西。看来很多公司内部网络上对QQ的封杀的确是相当明智的做法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 进一步讲，如果仅QQ这一工具就对我们的机器有了如此的监控，那么腾讯开发的其他工具又能让人放心吗？东方不亮西方亮，搞不好，明天QQ更新版本，不做这些监控了。不过却转移到QQ游戏、QQ音乐、QQ旋风下载之类的客户端工具上去，谁说得定呢？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 早些年，听说QQ为了改善用户体验，悄悄地对用户在QQ客户端上的所有行为进行了记录，不过出发点是好的，做得还不算过分，仅限于自身软件用户行为的记录。可现在你这样将监控范围无限制的扩大化，远超出了改善QQ软件本身用户体验而收集用户隐私的范畴。点解啊？莫非处于某种不可告人的目的，莫非也不是你自愿的，而是中国特色的互联网环境&amp;#8220;逼&amp;#8221;着你监控大家的。如果这样，那你确实也没办法去掉这些隐私监控的小偷行为，那俺们只有另换一种相对信息安全一点的即时通讯工具了。如果360借此机会推出自己的即时通讯工具，不妨暂时一试。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&lt;font color="#ff0000" size="6"&gt;&lt;span style="font-size: 14pt"&gt;别了，腾讯QQ。别了，腾讯所有的&amp;#8220;山寨&amp;#8221;应用。尽管哥现在已经不常用QQ了，不过还有很多亲戚朋友、哥们弟兄天天在QQ上面耗着，给大家提个醒。小心为妙！&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="6"&gt;&lt;span style="font-size: 14pt"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="center"&gt;&lt;img height="479" alt="图片" src="http://b56.photo.store.qq.com/http_imgload.cgi?/rurl4_b=d2227c9e10e5de4e777ec3822b82184aed4dca37a75f2ea1f4243fe5be427784e115759957dd80ad1cae71d604cac6a02e03a6a20800456f80e4662375b94c63300c884178675fab2431f0926ba6dff65233d20b&amp;amp;a=53&amp;amp;b=56" width="670" vpos="up" appendurl="1" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heekui/aggbug/1838064.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heekui/archive/2010/09/29/1838064.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2010/08/12/1797940.html</id><title type="text">VS2005打开VS2008项目的2种方法（转）</title><summary type="text">vs2008支持.net3.5，而vs2005支持.net2.0，所以使用vs2005打开vs2008的项目，要确定你的项目是.net2.0的。下面介绍2种方法：方法1：用记事本打开.sln文件，你将看到Microsoft Visual Studio Solution File, Format Version 10.00# Visual Studio 2008你把它改成：Microsoft Vis...</summary><published>2010-08-12T03:12:00Z</published><updated>2010-08-12T03:12:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2010/08/12/1797940.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2010/08/12/1797940.html"/><content type="html">vs2008支持.net3.5，而vs2005支持.net2.0，所以使用vs2005打开vs2008的项目，要确定你的项目是.net2.0的。&lt;br /&gt;&lt;br /&gt;下面介绍2种方法：&lt;br /&gt;&lt;br /&gt;方法1：用记事本打开.sln文件，你将看到&lt;br /&gt;Microsoft Visual Studio Solution File, Format Version 10.00&lt;br /&gt;# Visual Studio 2008&lt;br /&gt;你把它改成：&lt;br /&gt;Microsoft Visual Studio Solution File, Format Version 9.00&lt;br /&gt;# Visual Studio 2005&lt;br /&gt;即可用2005来打开&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;wbr&gt;&lt;br /&gt;&lt;br /&gt;方法2：&lt;br /&gt;1. 用记事本打开解决方案文件[解决方案名].sln，然后修改最上面两行为如下代码：&lt;br /&gt;Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. 用记事本打开每个项目文件[项目名].csproj，在&amp;lt;PropertyGroup&amp;gt;节点下移除如下节点：&lt;br /&gt;&amp;lt;TargetFrameworkVersion&amp;gt;v2.0&amp;lt;/TargetFrameworkVersion&amp;gt;&lt;br /&gt;并且修改ProductVersion和Import两个节点为如下：&lt;br /&gt;&amp;lt;ProductVersion&amp;gt;8.0.50727&amp;lt;/ProductVersion&amp;gt;&lt;br /&gt;&amp;lt;Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /&amp;gt;&lt;br /&gt;&lt;br /&gt;这样应该就可以打开了。&lt;img src="http://www.cnblogs.com/heekui/aggbug/1797940.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heekui/archive/2010/08/12/1797940.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2010/03/26/1698105.html</id><title type="text">【转】Oracle Conversion Functions</title><summary type="text">Oracle Conversion FunctionsVersion 11.1Note: Functions for converting to date, numeric, string, and timestamp data types can be found through the related links.ASCIISTRConverts An ASCII String To An A...</summary><published>2010-03-26T15:39:00Z</published><updated>2010-03-26T15:39:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2010/03/26/1698105.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2010/03/26/1698105.html"/><content type="text">Oracle Conversion FunctionsVersion 11.1Note: Functions for converting to date, numeric, string, and timestamp data types can be found through the related links.ASCIISTRConverts An ASCII String To An A...</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2009/09/12/1565507.html</id><title type="text">晨星、银河基金业绩排行榜数据转换工具</title><summary type="text">  最新做一些基金业绩比较的工作，必不可少的需要用到晨星、银河这两家证监会认可的大佬发布的业绩排行榜。但却存在一个很大的问题，两家公司的榜单格式都是自定义的，没有统一标准，也不是传统的二维表。  为了在此基础上开发的程序比较方便的获取数据，所以用VBA做了如下 《评级报告数据转换.xla》的EXCEL插件，较好的将榜单转换为了传统的二维表，这样不管是直接使用，还是导入数据库都比较方便，特分享与大家，有需要的同学可以下载试用。</summary><published>2009-09-12T11:53:00Z</published><updated>2009-09-12T11:53:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2009/09/12/1565507.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2009/09/12/1565507.html"/><content type="text">  最新做一些基金业绩比较的工作，必不可少的需要用到晨星、银河这两家证监会认可的大佬发布的业绩排行榜。但却存在一个很大的问题，两家公司的榜单格式都是自定义的，没有统一标准，也不是传统的二维表。  为了在此基础上开发的程序比较方便的获取数据，所以用VBA做了如下 《评级报告数据转换.xla》的EXCEL插件，较好的将榜单转换为了传统的二维表，这样不管是直接使用，还是导入数据库都比较方便，特分享与大家，有需要的同学可以下载试用。</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2009/07/30/1535516.html</id><title type="text">ORACLE纯SQL实现多行合并一行</title><summary type="text">项目中遇到一个需求，需要将多行合并为一行。网上查了很多方法，但通常而言都是编写自定义多行文本合并函数，或者对支持的列数具有局限性。最后在英文google中搜到如下比较巧的方法。不用在数据库中增加function，纯SQL一次性搞定，而且扩充性很好，没有列的限制。……</summary><published>2009-07-30T14:15:00Z</published><updated>2009-07-30T14:15:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2009/07/30/1535516.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2009/07/30/1535516.html"/><content type="text">项目中遇到一个需求，需要将多行合并为一行。网上查了很多方法，但通常而言都是编写自定义多行文本合并函数，或者对支持的列数具有局限性。最后在英文google中搜到如下比较巧的方法。不用在数据库中增加function，纯SQL一次性搞定，而且扩充性很好，没有列的限制。……</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2009/07/14/1523210.html</id><title type="text">ASP.NET项目添加Log4Net后，发布后无法写日志</title><summary type="text">最近用.Net新建了一个Webservice，在项目添加Log4Net后，测试状态下一切正常。但一旦发布服务到IIS以后，发现日志不能正常记录了。屡次失败后，偶然想到，难道是文件夹权限的问题。于是尝试为此服务文件夹的已验证用户设置修改和写入权限，日志记录OK！留此备忘。</summary><published>2009-07-14T05:48:00Z</published><updated>2009-07-14T05:48:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2009/07/14/1523210.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2009/07/14/1523210.html"/><content type="text">最近用.Net新建了一个Webservice，在项目添加Log4Net后，测试状态下一切正常。但一旦发布服务到IIS以后，发现日志不能正常记录了。屡次失败后，偶然想到，难道是文件夹权限的问题。于是尝试为此服务文件夹的已验证用户设置修改和写入权限，日志记录OK！留此备忘。</content></entry><entry><id>http://www.cnblogs.com/heekui/archive/2009/06/20/1507195.html</id><title type="text">“必应”不应、“谷歌”不歌</title><summary type="text">在过去差不多一个月的时间里，先后看到这样两则新闻：1、微软新推的搜索引擎网站bing（必应）http://cn.bing.com/，因搜索结果可能包含YY视频内容，而且不需要进入视频所属网站，直接点击即可播放的便利功能。受到互联网管理部门的直接禁止访问的处罚，中文bing网站中止了很多天。2、谷歌中国的http://www.google.cn,引领搜索时尚的用户输入部分关键字时，得到自动提醒的关键字补充功能。因涉及某些YY关键字自动匹配，以及查询结果中有大量不“河蟹”的内容，也收到了处罚和限期整改的通知。 当然，对于公共关系维持、危机公关的处理上，两大公司都及时采取了措施。微软，清洗了大量不和谐的关键字，同时关闭了视频结果直接播放功能，......</summary><published>2009-06-19T19:12:00Z</published><updated>2009-06-19T19:12:00Z</updated><author><name>网际浪人</name><uri>http://www.cnblogs.com/heekui/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heekui/archive/2009/06/20/1507195.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heekui/archive/2009/06/20/1507195.html"/><content type="text">在过去差不多一个月的时间里，先后看到这样两则新闻：1、微软新推的搜索引擎网站bing（必应）http://cn.bing.com/，因搜索结果可能包含YY视频内容，而且不需要进入视频所属网站，直接点击即可播放的便利功能。受到互联网管理部门的直接禁止访问的处罚，中文bing网站中止了很多天。2、谷歌中国的http://www.google.cn,引领搜索时尚的用户输入部分关键字时，得到自动提醒的关键字补充功能。因涉及某些YY关键字自动匹配，以及查询结果中有大量不“河蟹”的内容，也收到了处罚和限期整改的通知。 当然，对于公共关系维持、危机公关的处理上，两大公司都及时采取了措施。微软，清洗了大量不和谐的关键字，同时关闭了视频结果直接播放功能，......</content></entry></feed>
