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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值