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的同步和异步
同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同 ...
随机推荐
- day6_自定义类型转换
#include <iostream> using namespace std; class Point2D{ public: Point2D(int x, int y):m_x(x), ...
- MySQL 存储过程返回多个值
MySQL 存储过程返回多个值 在本教程中,您将学习如何编写/开发返回多个值的存储过程. MySQL存储函数只返回一个值.要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程 ...
- 2018-2019-2 网络对抗技术 20165303 Exp1 PC平台逆向破解(BOF实验)
1.实践目的 本次实践的对象是一个名为pwn1的linux可执行文件. 三个实践内容如下: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个 ...
- IDEA永久激活方法
Idea版本:2018.1.5 准备工作: 1.安装,从官网下载安装,点击进去之后,进行选择需要的版本 2.下载破解包: 链接:https://pan.baidu.com/s/1lCb0MGetP1_ ...
- python-作用域解析
局部作用域和全局作用域:局部作用域不能修改全局作用域的变量 count = 10 def outer(): #global count 局部变量改成全局变量,global声明一下即可.就可以修改了. ...
- php无限极分类的实现
//指定根层级的树状图 function generateTree($list, $root = 0, $pk = 'id', $pid = 'pid', $child = '_child') { $ ...
- 使用session统计在线人数
效果图如下 这里是Chrome浏览器新登录一个用户 代码展示 package com.test.Util; import java.util.ArrayList; import javax.servl ...
- mui底部选项卡切换实现
MUI提供了两种webview和div模式,来实现底部选项卡切换 效果相同,div是在同一个页面实现所有切换块的页面,根据id导航,而webview是由多个页面组成,形成页面之间的来回跳转
- SQL Server 创建索引方法
转自 <SQL Server 创建索引的 5 种方法> 地址:https://www.cnblogs.com/JiangLe/p/4007091.html 前期准备: create tab ...
- 如何正确可视化RAW(ARW,DNG,raw等格式)图像?
为了正确可视化RAW图像,需要做好:白平衡.提亮以及色彩映射. import numpy as np import struct from PIL import Image import rawpy ...