zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java并发(三):重排序
    Java并发(六):volatile的实现原理
    Java并发(五):synchronized实现原理
    Java并发(一):多线程干货总结
    JDK源码学习笔记——String
    Java并发(二):Java内存模型
    JVM命令-java服务器故障排查
    vue之数据请求方式
    vue之菜单添加选择,知识:数据双向绑定、循环渲染、事件点击以及按键的点击
    Vue【第3章】:Vue常用指令二:事件和方法
  • 原文地址:https://www.cnblogs.com/luomingui/p/2546054.html
Copyright © 2011-2022 走看看