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/
四、2.0 版本 的多线程
其实修改的地方很少就是 把c# lambda表达式换成C# 2.0 等同的代码 如:
还需要建立一个委托 ”public delegate void Action (); ” 因为在2.0 中没有这个委托 如下对比图。
代码全貌。
使用示例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.htmlhttp://www.cnblogs.com/fangfan4060/archive/2009/07/16/1525166.html
总共介绍了 "标准"模式,”UIThread“ 模式,"匿名委托" 模式,"最小匿名委托"模式
七、 直接下载源码看了