WPF 中的多线程编程模型
WPF 调度器 Dispatcher
WPF 每个元素都有用一个Dispatcher属性,Dispatcher会自动在线程池中按优先级对工作项进行排队和调度。通过该属性执行指定的委托,即可实现不同线程之间的交互,而不出现死锁问题。
中常用的方法:Invoke(), InvokeAsync( )
TextBox1.Dispatcher.Invoke( ...)
TextBox1.Dispatcher.InvokeAsync( ...)
Invoke( ) 方法是同步调用,即直到在线程池中实际执行完该委托它才返回。
InvokeAsync( ) 方法是异步调用,调用方法后立即将返回到调用语句,然后继续执行该语句后的代码。
Invoke ( )重载形式:
Invoke (Action);
Invoke (Action,DispatcherPriority);
Invoke (Action,DispatcherPriority, CancellationToken);
Invoke (Action,DispatcherPriority,CancellationToken,TimeSpan)
Invoke(Func);
Invoke(Func,DispatcherPriority);
Invoke(Func,DispatcherPriority, CancellationToken);
Invoke(Func,DispatcherPriority, CancellationToken,TimeSpan);
应用程序域以及基本操作
(1) 基本概念
应用程序域与线程的关系
应用程序域与进程的关系
什么时候使用应用程序域
(2)程序集与反射
创建程序域是依靠对程序集(.dll, .exe)进行反射来实现的。
程序集 Assembly 是.NET框架应用程序生成的块,它为公共语言运行库CLR提供了识别和实现类所需要的信息。
反射 提供了封装程序集,模块和类型的对象。可以使用反射动态的创建类的实例,将类绑定到现有对象,或从现有对象中获取类,并调用类的方法或访问其字段和属性。
System.Reflection 命名空间
1. Type类
使用Type对象的方法,字段,属性和嵌套类来查找有关类型的所有信息。
一,使用C#提供的typeof关键字获取指定类型的Type对象,如:
Type t= typeof(System.double);
二,调用Type类的GetType静态方法获取指定类型的Type对象,如:
Type t= Type.GetType("System.Double");
Type类提供的大多数方法都可以获取指定数据类型的成员信息,如构造函数,属性,方法,事件等。
Type t= typeof(MyClass);
System.Reflection.MethodInfo[ ] Methods = t.GetMethods();
foreach(var m in Methods)
{
console.wirteline(m.Name);
}
2. Assembly类
它可以访问给定程序集的元数据,并包含可执行一个程序集的方法。
静态的Load方法,可以加载程序集(.dll文件或.exe)文件
例如:从Example.exe 的程序集加载到当前应用程序域,最后通过委托执行方法。
System.Reflection.Assembly a= System.Reflection.Assembly.Load("Example");
Type t= a.GetType("MyClass");
System.Reflection.MethodInfo m=t.GetMethod("MethodName");
Object obj=Activator.CreateInstance(t);
m.Invoke(obj, null);