C#中委托的同步和异步有什么区别
通过定义委托,来实现同步和异步,委托通过Action和Func来实现,记录学习委托的同步和异步的过程
委托的同步方法
委托的Invoke方法用来进行同步调用。
static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); action.Invoke(); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.Invoke("我在测试"); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t;
};
bool b = func.Invoke(5);
Console.WriteLine("{0}",b); Console.Read();
}
同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。
委托的异步调用
异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。
static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); action.BeginInvoke(null,null); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.BeginInvoke("我是个测试",null,null); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t;
};
var result = func.BeginInvoke(5,null,null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read();
}
异步回调
用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。
static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); AsyncCallback callback1 = t =>
{
Console.WriteLine("我是回调1");
}; action.BeginInvoke(callback1, null); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);
AsyncCallback callback2 = t =>
{
Console.WriteLine("我是回调2");
};
action2.BeginInvoke("我是个测试", callback2, null); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t; };
AsyncCallback callback3 = t =>
{
Console.WriteLine("我是回调3");
};
var result = func.BeginInvoke(5, callback3, null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read();
}
C#中委托的同步和异步有什么区别的更多相关文章
- 关于js中Ajax的同步、异步使用
下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...
- iOS开发中如何实现同步、异步、GET、POST等请求实操演示!
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...
- JS中Ajax的同步和异步
ajax同步 : 意味着此时请求Server后,JS代码不再继续执行,等待Server返回后才继续往下执行. ajax异步 : 意味着此时请求Server后,JS代码继续执行,不管Server什么时候 ...
- Java系统中如何拆分同步和异步
很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的 ...
- java交互方式中的同步与异步
JAVA中交互方式分为同步和异步两种: 1.同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程; 2.异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即 ...
- 谈IO中的阻塞和非阻塞,同步和异步及三种IO模型
什么是同步和异步? 烧水,我们都是通过热水壶来烧水的.在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开.随着科技的发展,现 ...
- C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
C# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] dat ...
- 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...
- Java的同步和异步
同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同 ...
随机推荐
- 无法添加注解@Resource
Spring项目中缺少javax.annotation包的依赖
- spring boot2.0(一 ) 基础环境搭建
1.基础配置 开发环境:window jdk版本:1.8(spring boot2.0最低要求1.8) 开发工具:eclipse 构建方式:maven3 2.POM配置文件 <project x ...
- python运用PIL制作GIF
与一.安装Pillow 安装地址:https://pypi.org/project/Pillow/#files 二.准备好图片,并从0开始命名,如下图: (ps:记得存图位置与新建的py文件在同一存放 ...
- android -------- Hawk数据库
Hawk 是一个非常便捷的数据库 . 操作数据库只需一行代码 , 能存任何数据类型 . github 地址: https://github.com/orhanobut/hawk 一.概念 Share ...
- echarts常用方法,item小坑(二)
在echarts折线图使用过程中,我们会遇到折线拐点symbol的问题.这个问题是在版本3.8.5引用时发现的.折线图在支持legend显示的情况下需要考虑. 问题描述如下:如果采用echarts提供 ...
- jquery源码解读
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐进增强)优雅的处理能 ...
- idea 的一些基本的配置
1. 2. 3. http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce 531403098@qq.com R+0oOAb3rx ...
- android studio 编辑markdown文件
作为开发人员,对markdown应该比较熟悉,我们在Android开始中,可以使用studio引入Markdown Navigator插件,进行编辑. 搜索 Markdown Navigator 安装 ...
- 银行卡卡bin
卡BIN指的是发卡行识别码,英文全称是 Bank Identification Number,缩写为 BIN.中文即“银行识别代码” 银行卡的卡号是标识发卡机构和持卡人信息的号码 一般是13-19位 ...
- 常用的lamp环境以及一些依赖包的安装