Go to my github

OEA框架学习:多线程

一、摘要

        由于工作需要,就想着把OEA里的多线程提取出来,但OEA 是4.0 的产物,看了一下代码 OEA里的多线程用的是3.0的技术,有戏就想着翻译成2.0的了 :)  我们还在2.0上挣扎着,贴出来也是为了以后可能还会用到,做个备份了,和我一样还在2.0 上挣扎的童鞋有救了¥@……¥*%)。

二、本文大纲

       a、摘要  

       b、本文大纲

       c、OEA 多线程 

       d、2.0 版本 的多线程  

       e、NET 4.0  Task处理多线程
       f、WinFrom线程问题

三、OEA 多线程

OEA 多线程的代码被作者放在哪呢,就在OEA 主项目中的Utils中看下图,代码大家可以到可以到BloodyAngel的博客和中可以得到,另附上源码下载地址:OEA框架 2.9 Pre-Alpha 源码公布  对OEA感兴趣的可以看看下面的博客

http://www.cnblogs.com/luomingui/tag/OEA/ 

http://www.cnblogs.com/zgynhqf/tag/OEA/

http://www.cnblogs.com/zhoujg/tag/OpenExpressApp/

image

四、2.0 版本 的多线程

其实修改的地方很少就是 把c# lambda表达式换成C# 2.0 等同的代码 如:

4N7LCAJX2RG6)GA`IU`TKYF

还需要建立一个委托 ”public delegate void Action (); ”  因为在2.0 中没有这个委托 如下对比图。

Q$R]CV45CGA}01COT6K%GJK

WSX)(PTV}87GS{`0VYWOW8F

代码全貌。

image 

使用示例1:

 

ThreadHelper.AsyncMultiActions.Execute(delegate 
{
     DealInfo(handler, receivedData);
});

 

使用示例2:

  #region 异步加载数据的关系

   [NonSerialized]
   private ForeAsyncLoader _relationLoader;
   ///// <summary>
   
///// 如果是树,则异步整理数据。
   
///// 
   
///// 由于本类的操作都要用到树的关系,但是建立这个关系需要一定时间,所以这里采用异步模式。
   
///// </summary>
   public ForeAsyncLoader RelationLoader
   {
       get
      {
          if (this._relationLoader == null)
          {
               this._relationLoader = new ForeAsyncLoader(this.LoadRelation);
           }
          return this._relationLoader;
       }
   }
   private void LoadRelation()
   {
       var treeList = this._displayList as IOrderedTreeNodeCollection;
       if (treeList != null)
       {
           treeList.EnsureObjectRelations();
       }
   }
   #endregion
五、.NET 4.0  Task处理多线程

        .NET 4 中 包含了新名称空间System.Threading.Task。它包含的类抽象出了线程的功能。使用Task类创建的任务是后台线程,所以在前台线程全部终止的时候,如果任务还没有全部执行万,就会被被动终止。

1. 定义一个多线程:     

    static class MyClass

    {
        [STAThread]
        static void Main()
        {
            var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => DoSomeWork());    
        }
        public static void DoSomeWork()
        {
            Console.WriteLine("nihao ");
            System.Threading.Thread.Sleep(3000);
            Console.Write("nihao ");
        }
    }

 2.多线程执行后, 执行另一個方法

    class MyClass 
    {
        [STAThread]
        static void Main()
        {
            //2.多線程執行后,執行另一個方法
            var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => DoSomeWork()).ContinueWith(
            task => { Console.WriteLine(task.Result.ToString()); });
        }
     }

 3.等待所有线程结束

    class MyClass
    {
        [STAThread]
        static void Main()
        {
            //3.等待所有線程結束
            var task1 = Task.Factory.StartNew(() => DoSomeWork());
            var task2 = Task.Factory.StartNew(() => DoSomeWork());
            var task3 = Task.Factory.StartNew(() => DoSomeWork());
            Task.WaitAll(task1, task2, task3);
        }
    } 

 4.等待其中一个线程结束

  class MyClass
    {
        [STAThread]
        static void Main()
        {
            //4.等待其中一個線程結束
            var task1 = Task.Factory.StartNew(() => DoSomeWork());
            var task2 = Task.Factory.StartNew(() => DoSomeWork());
            var task3 = Task.Factory.StartNew(() => DoSomeWork());
            Task.WaitAny(task1, task2, task3);
        }
  } 

 5.等待所有线程结束的方法  

    class MyClass 
     {
        [STAThread]
        static void Main()
        {
            //4.等待其中一個線程結束
            var task1 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                return "dummy value 1";
            });

            var task2 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                return "dummy value 2";
            });

            var task3 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                return "dummy value 3";
            });

            Task.Factory.ContinueWhenAll(new[] { task1, task2, task3 }, tasks =>
            {
                foreach (Task<string> task in tasks)
                {
                    Console.WriteLine(task.Result);
                }
            });
        }
    }

 目前我在项目中用的最多的是第一种方法,其他的是扩展的学习。

 相关学习资料:

http://www.soaspx.com/dotnet/csharp/csharp_20120618_9290.html

http://technet.microsoft.com/zh-CN/library/system.threading.tasks.taskcreationoptions 

http://www.cnblogs.com/zjypp/archive/2012/06/01/2530918.html

http://www.whochris.com/C_biancheng/66.html 

http://www.mysjtu.com/page/M0/S631/631249.html

这几个文章对 System.Threading.Tasks 都做了详细的介绍了这次感谢作者的分享。

六、 WinFrom线程问题

最近在开发WinFrom项目的时候总是会碰到线程问题,郁闷死了估做了一模板如下:         

                 if (InvokeRequired) 
                 {
                    this.Invoke(new MethodInvoker(delegate
                    {
                       
                    }));
                }
                else
                {
                  
                }

在个个页面中到处复制,挺纠结的就不断的Google 看有没有更好的方法解决这个问题。

皇天不负有心人还真找到一篇好文章:http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequired 园里还有翻译的呢:

http://www.cnblogs.com/fangfan4060/archive/2009/07/16/1525158.html

http://www.cnblogs.com/fangfan4060/archive/2009/07/16/1525159.html 

http://www.cnblogs.com/fangfan4060/archive/2009/07/16/1525166.html

总共介绍了 "标准"模式,”UIThread“ 模式,"匿名委托" 模式,"最小匿名委托"模式

七、 直接下载源码看了

btn_download

posted @ 2012-06-12 11:07  峡谷少爷  阅读(1818)  评论(0编辑  收藏  举报