winfrom界面委托
在对控件进行操作的时候,可以通过判断当前线程是否为控件所在线程外的线程。如果是,则调用Invoke。
private void AlertMessage(string message) { if(InvokeRequired) { BeginInvoke(new Action<string>(AlertMessage), message); } else { MessageBox.Show(message); } }
也可以直接通过控件类直接调用Invoke方法,底层代码会自己判断线程并将请求委托。
ConsoleTbx.Invoke(new Action<string>(AlertMessage),message);
private void AlertMessage(string message) { MessageBox.Show(message); }
wpf界面委托
可以通过控件进行委托
TextBox1.Dispatcher.BeginInvoke(new Action<bool>(DisableCameraButton), enable)
线程间委托
不同类不同线程
不同类之间不同线程使用事件,事件是一种特殊的委托。通过在一个类中将一个方法订阅给另一个类,在另声明了事件的类中调用。
需要注意的是,既然已经将方法委托出去,方法内代码所属线程必然是调用方所属线程,而不是方法实现所在类的线程中。
public class A { public A() { B b = new B(); b.OnEventTrigger += EventMethod; } // 自己实现的方法 // 其中参数e为方法调用时传递的DataArgs类型的对象 ,通过这个对象访问他的成员变量 private void EventMethod(object sender, DataArgs e) { ...// 方法实现 } } public class B { public event EventHandler<DataArgs> OnEventTrigger; public void test() { if(OnEventTrigger != null) { DataArgs d = new DataArgs("Hello World!"); OnEventTrigger(d); } } } // 自己编写的事件所传递的参数类,继承与EventArgs类 public class DataArgs : EventArgs { public string Message {get; private set;} public DataArgs(string message) { this.Message = message; } }
同一个类不同线程
当在同一个类中,可以使用更为简单的委托来实现
public clas A { private delegate void TestInvoke(string message); }
匿名委托
匿名委托俗称闭包,就是将一段代码和其中涉及到的数据一起打包委托调用。
总所周知,在js中,闭包是最常见的一种匿名回调。
在C#中,我们称之为匿名委托。直接将方法体与数据委托调用,就是将这二者打包发送过去,让其调用。打包的过程就称之为闭包。
闭包时特别涉及到数据访问问题,方法体对父方法体内的数据拥有访问权限,能够在方法体中直接使用,回调时的数据是闭包时的数据复制。