在几个WPF桌面应用系统开发中经常会用到委托,在这里稍微总结一下。
主要应用:
1.线程间的访问
2.自定义事件
线程间的访问:
在多线程编程中,我们经常会需要在子线程中访问主线程的内容,特别是更改主窗体的UI界面内容,如果直接访问跨线程资源,系统就会报线程访问错误.
在WinForm中窗体类提供了Invoke方法以从子线程中访问主线程资源.
在WPF中Window类并没有Invoke方法,但是WPF提供了专门负责线程调度工作的Window.Dispatcher类,每个线程都有一个,我们在一个线程中要让另一个线程做事情,其实就是调用目标Dispatcher调度完成.
在WPF中使用委托访问主线程的代码如下:
private delegate void DelegateShowMessage(string msg); //定义委托
private void ShowMessageInvoke(string msg) //委托访问接口
{
DelegateShowMessage d = ShowMessage;
this.Dispatcher.Invoke(d);
}
private void ShowMessage(string msg) //要让主线程完成的事情
{
txtMsg.Text = msg;
}
这样,在子线程中直接调用ShowMessageInvoke方法就可以了.
上面代码中的this.Dispatcher就是主线程的线程调度员.我们在自定义一个WPF控件的时候,也可以使用这一方法. Dispatcher除了使用Invoke方法调用委托之外,还可以使用BeginInvoke方法,区别在于BeginInvoke是异步执行的.
另外,在没有Dispatcher属性的类中也可以使用Application.Current.Dispacther,它与this.Dispatcher是一样的.
自定义事件:
自定义事件代码如下:
public delegate void OnHaveReceDataDelegate(int length); //定义委托
public event OnHaveReceDataDelegate OnHaveReceData; //定义事件
触发事件:
if (OnHaveReceData != null)
{
OnHaveReceData(100);
}
最近在用,作为留存。
http://blog.csdn.net/jiminull/article/details/7743441