C#委托、同步调用、异步调用总结

来源:互联网 发布:哈尔滨软件开发88087 编辑:程序博客网 时间:2024/05/20 11:48

C#委托、同步调用、异步调用总结

本文主要总结我对c#的委托、同步调用、异步调用的初步理解,我工作的时候看公司代码看到的对于异步调用的使用方法,我觉得不明而厉,于是试着自己做了个例子,发现并不是很难理解。如果有什么理解错误的地方,请不吝指出,谢谢!


委托的使用与理解

概念:委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。 你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法。 —— 引自 [ MSDN ]

目前我会的只有三种委托delegate、action、Func。还有种predicate没接触过。介绍这几种委托之前,一定要知道委托的构成一定要满足四个条件:
声明委托类型
必须有一个方法包含了要执行的代码
必须创建一个委托实例
必须调用(invoke)委托实例

delegate

声明委托类型:Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。例:

delegate int MethodtDelegate(string input);//表示有一个参数,并返回int型。

必须有一个方法包含了要执行的代码:写一个方法,返回值类型一致且传入的参数类型与数量一致。例:

int Method(string input)//表示有一个参数,并返回int型。与上面的委托一致{    //实现}

必须创建一个委托实例:有了方法与委托类型,接着创建委托类型的一个实例,指定在调用委托实例时就执行该方法。例:

MethodtDelegate md = new MethodtDelegate(Method);//实例化委托

调用委托实例:调用一个委托实例的方法就可以了。这个方法本身被称为Invoke。注意:Invoke是同步方法,会等Method方法执行完之后才继续执行。例:

string input="123";//先定义一个字符型变量int result;//定义一个接受返回值的整型变量result=md.Invoke(input);//传入与委托相同的参数类型与数量即一个string类型的input

同步调用

其实,同步调用的方法在上面讲委托的时候已经写出了,那个Invoke方法就是同步方法。同步调用又称为阻塞调用,如果用在UI线程上,会造成窗口的假死,尤其是一些操作量大的执行语句,等他执行到一半窗口就未响应了,一般人看到未响应直接结束进程,软件就不是很稳定。这时候就要用到异步调用。

异步调用

异步调用与同步调用的不同在与委托的第四点调用委托实例处,使用BeginInvoke方法。使用了该方法后程序在执行到这里时不会等待委托方法执行完,而是继续执行下去。但是Delegate.BeginInvoke方法是从ThreadPool取出一个线程来执行这个方法,以获得异步执行效果的。也就是说,如果采用这种方式提交多个异步委托,那么这些调用的顺序无法得到保证。而且由于是使用线程池里面的线程来完成任务,使用频繁,会对系统的性能造成影响。例:

string input="123";//先定义一个字符型变量md.BeginInvoke(input, new AsyncCallback(Back), null);//传入与委托相同的参数类型与数量即一个string类型的input,最后一个参数我目前不知道干嘛用的就用了null,如果有知道的,麻烦在评论里指出。

上面的第二个参数new AsyncCallback(Back)是一个实例化的回调函数,参数是一个方法,该方法中可以对委托方法的返回值进行操作。即:

void Back(IAsyncResult ar){    AsyncResult result = (AsyncResult)ar;//AsyncResult 具有 AsyncDelegate 属性,该属性保存在其上调用异步调用的委托对象。    MethodtDelegate action = (MethodtDelegate)result.AsyncDelegate;//获取异步调用的委托实例    int str = action.EndInvoke(ar);//该参数就是返回值}

本文一些语句主要参考了《深入理解C#(第2版)》,在此表达诚挚的敬意

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 兴山香溪大酒店欠钱不还怎么办 黑坑青鱼滑口怎么办 不交物业费物业怎么办 车牌刮了一点漆怎么办 电脑光驱线坏了怎么办 做系统不读光驱怎么办 光盘放进电脑没反应怎么办 不服省高院裁定维持原判怎么办 咖啡和酒一起喝怎么办 跟法官联系不上怎么办 四维没有预约到怎么办 钥匙锁在车里怎么办 如果孩子很叛逆骂人打人怎么办 错过了今年规培怎么办 枣木怎么办才能搞直了 高中生和家里闹意见离家出走怎么办 校长信箱实名举报了怎么办 枣子吃多了胀气怎么办 红枣吃多了会怎么办 宁波南苑e家会员卡怎么办 宁波社保卡丢了怎么办 奶茶汉堡店经营不好改怎么办 军人保障卡丢了怎么办 军人保障卡丢失了怎么办 军人保障卡掉了怎么办 椎基底动脉供血不足怎么办 颈椎压迫神经脑供血不足怎么办 脑部基底动脉轻度狭窄怎么办 胸壁疼痛我该怎么办 厂房面积小于泄压面积怎么办 江苏海门农村自建房房产证怎么办 颈总动脉斑块形成怎么办 颈椎引起腔梗头晕怎么办 魅族手机变成英文怎么办 员工失去了工作乐趣怎么办 古墓丽影9出bug怎么办 气炉子打不着火怎么办 下面人员不参加公司拓展怎么办 重点班的差生怎么办 江苏考生选修考d怎么办 眼睛里有虫子该怎么办