C# 特性
2018-10-24 本文已影响1人
清水包哟
泛型
无
lambda表达式
无
匿名函数
无
委托
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#中,我们称之为匿名委托。直接将方法体与数据委托调用,就是将这二者打包发送过去,让其调用。打包的过程就称之为闭包。
闭包时特别涉及到数据访问问题,方法体对父方法体内的数据拥有访问权限,能够在方法体中直接使用,回调时的数据是闭包时的数据复制。