Coding

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#中,我们称之为匿名委托。直接将方法体与数据委托调用,就是将这二者打包发送过去,让其调用。打包的过程就称之为闭包。

闭包时特别涉及到数据访问问题,方法体对父方法体内的数据拥有访问权限,能够在方法体中直接使用,回调时的数据是闭包时的数据复制。

上一篇 下一篇

猜你喜欢

热点阅读