文档章节

委托

沉默狮
 沉默狮
发布于 2015/06/05 10:01
字数 573
阅读 22
收藏 0

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

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

© 著作权归作者所有

共有 人打赏支持
沉默狮

沉默狮

粉丝 10
博文 54
码字总数 25252
作品 0
成都
程序员
谈谈.Net 4.0 中的委托delegate

.Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果。但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接...

长平狐
2012/06/08
76
0
Unity3D学习资源:委托和lambda表达式一

一.在C#中我们可以使用delegate关键字来声明一个委托,声明的格式如下: delegate <函数返回类型> <委托名> (<函数参数>) 下面我们来看一下代码是如何来写的: [C] 纯文本查看 复制代码 using ...

浩浩老师
2015/09/17
166
0
委托的简单用法

委托的用法简单示例一 usercontrols:里面写法如下: public delegate void ButtonClickHandler(); public event ButtonClickHandler ButtonClick; form1里面定义时间: this.usercontrols.But......

长平狐
2013/03/28
31
0
委托(Delegate)

作者 :Kemin's booootLog http://blog.csdn.net/keminlau/ C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用...

晨曦之光
2012/03/09
313
0
.NET中的委托和事件(续)

首先感谢大家对我博文的支持,在这篇博文中我会向大家继续介绍.NET中的委托与事件,这次是对前面的知识的进一步加深学习。首先回答一下前面各位提及到的问题。 答:多数情况下委托封装方法都...

长平狐
2012/06/11
75
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
17分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
30分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
46分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
46分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部