csharp 异步编程

news/2023/5/28 8:43:26

csharp 异步编程

当有多个任务需要同时执行,或者有比较费事的操作时但不想阻塞主线程的时候,我们往往会使用到多线程编程,但是多线程编程本身需要很强的
多线程编程思维,需要解决诸多问题:如线程锁、线程间的数据同步等问题。csharp提供了异步编程的模式,.net提供了三种模式:基于任务的
异步编程(TAP)、基于事件的异步编程(EAP)、异步编程模式(APM)三种模式

TAP

csharp虽然提供了三种不同的异步编程的模式,但是相对于EAP和APM,TAP使用起来更简单易用,TAP是基于task的异步编程模式,使用一个方
法就能完成所有的操作。从代码阅读角度去看,TAP的整理逻辑和同步的逻辑基本一样。具体的EAP和APM使用方式可以参见下面的介绍,它们都涉
及到多个方法,才能完成异步操作。当异步操作比较多的时候,EAP和APM都会会陷入callback hell。

我们在设计游戏中的新手引导的时候,经常会有一些强制引导。比如下面的流程:

走到A点
打包宝箱
打包背包
使用物品

以前设计的时候,我们可能使用event设计模式,通过事件的监听与发布来解决此类问题。下面是一个伪代码,真实的设计中并不会真的这么设计,
这里只是为了说明callback hell的问题。下面的代码我们都是放在了guid类中,可能看起来还不算复杂,有的会将各事件的处理分布在不同的
函数中,这时就更头痛了。

public class Guild
{public Guild(){evnet.register("onPlayMove", onPlayMove);evnet.register("onGetBox", onGetBox);//...}public void Move(Vector3 postion){//pick box.}public void onGetBox(){//open bag.}
}

当时我们使用TAP模式编程时,上面的问题就会变的简单。

public class Guild
{public Guild(){await Player.Move(postion);await Player.PickItem();await openBag();await Player.UserItem();//....}
}

EAP

基于事件的异步模式,一般会有两个相应的API:MethodNameAsync和OnMethodNameCompleted.比如WebClient中的download相关的api

ManualResetEvent waitWeb = new ManualResetEvent(false);
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += (sender, eventArgs) =>
{Console.WriteLine("content length:{0}",eventArgs.Result.Length);Console.WriteLine("xxxx");waitWeb.Set();
};webClient.DownloadStringAsync(new Uri("http://www.baidu.com"));
Console.WriteLine("start download");
waitWeb.WaitOne();
Console.WriteLine("over");

执行结果

start download
content length:9193
xxxx
over

APM

APM是基于IAsyncResult设计模式完成的异步操作,具体是通过命名为BeginOperationName和EndOperationName的两个方法来实现的。
begin和end分别用于开始和结束并获取异步结果。例如Action中一个对BeginInvoke和EndInvoke,以及strem中的BeginRead和EndRead
这些api都是基于APM模式设计的。

 public class Demo{public string Test(double seconds){Console.WriteLine("Test Start");Thread.Sleep(TimeSpan.FromSeconds(seconds));Console.WriteLine("Test End");return $"Test cost:{seconds}s";}}class Program{delegate string AsyncCall(double seconds);static void Main(string[] args){Console.WriteLine("Hello World!");Demo demo = new Demo();AsyncCall asyncCall = new AsyncCall(demo.Test);var asyncResult = asyncCall.BeginInvoke(5, null, null);\Console.WriteLine("main sleep");Thread.Sleep(1000);Console.WriteLine("main sleep end!");Console.WriteLine(asyncCall.EndInvoke(asyncResult));Console.WriteLine("goodby!");}}

执行结果

Hello World!
main sleep
Test Start
main sleep end!
Test End
Test cost:5s
goodby!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4557023.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

error: resource drawable/edit_text_bg (aka com.example.track:drawable/edit_text_bg) not found.

就是这个怀疑人生的问题,我添加了几个布局,然后其他的布局一个接一个的报错说找不到资源 问题所在:写了两遍 解决方案:删除一行清空缓存重新来就行了

Ubuntu fatal: 无法访问 ‘https://github.com/xxxxx/xxxxx‘:Failed to connect to github.com port 443: 连接超时

Ubuntu fatal: 无法访问 ‘https://github.com/xxxxx/xxxxx’:Failed to connect to github.com port 443: 连接超时 今天想把自己的github仓库clone到本地,结果用终端命令行一直clone不成功,修改host、取消代理等等各种方法都尝试了都不行。…

【Xmy的第一次Python】

# The first Python project of XMY print(hello,world!) print(This is the first python project of Xmy.)x 3 print("x ", x, "id ", id(x))q 3 print("q ", q, "id ", id(q)) # x与q的值相等,id值相等y 666 prin…

解决PHP script * is protected by SourceGuardian

背景: 报错报错~ 错误详细文本 PHP script ‘/media/wwwroot/letogther.cn/***.php’ is protected by SourceGuardian and requires a SourceGuardian loader ‘ixed.7.2.lin’ to be installed.1) Click here to download the required ‘ixed.7.2.…

Echarts实现以秒为单位的动态三条折线图显示

先贴一下效果图(是动态显示数据,并且下面的拉动条可以缩小数据显示的范围) 横轴细节图: 直接贴完整代码:(同志们可以按照需要修改自己想要的折线条数和其他附加功能,本人在这里就保证单独下面这个html文件就可以运行起来) <!DOCTYPE html> <html lang="…

git pull出现fatal: unable to access ‘https://github.com/xxx.git‘: Failed to connect to github.com port

问题 执行git命令&#xff1a;git pull origin main&#xff1b; 出现&#xff1a;fatal: unable to access ‘https://github.com/xxx.git’: Failed to connect to github.com port 443 after xxx ms: Timed out。 解决方法 手动配置Git代理&#xff1a; 1.打开Shadowsoc…

python小练习(杂七杂八)

目录 一.斐波拉契数列 二.计算 30 以内可以被 3 整除的整数&#xff1a; 三.集合推导式 四.判断不是 abc 的字母并输出&#xff1a; 五.简单的if语句 六.狗狗年龄演算 八.if的嵌套 九.循环语句&#xff1a;1到100的和 十.无限循环 十一.while 循环使用 else: 十二.for循…

Linux下配置Java环境-------从买来云服务器到运行一个jar包--------建立一个简单网站

第一步&#xff1a;准备工作 个人新购买了一台云服务器、安装的是centos7.6系统 Linux_java8_下载地址 点击下载到本地、但还未上传到我的Linux系统里&#xff0c;接下来使用xshell和xftp来操作。 xshell为使用命令行、使用xftp是为了传输文件、如果你有可替换的选择、就可以…

ROS智能车定位导航仿真(已实现)

前提&#xff1a; 操作系统&#xff1a;ubuntu16.04 ROS版本&#xff1a;kinetic Gazebo版本&#xff1a;7.0.0 参考&#xff1a; https://blog.csdn.net/lxzysx/article/details/107042352 https://www.guyuehome.com/6463 目录 一. &#xff08;1&#xff09;创建工…

Spring之IOC概念、Bean对象创建及DI注入的三种方式

Spring的IOC(inverse of control )如何理解 首先我们先比对Java中两类创建对象的方式。 方式1&#xff1a;通过new关键字创建实例对象 private IAccountDao accountDao new AccountDaoImpl();方式2&#xff1a;通过工厂获取实例对象 private IAccountDao accountDao BeanFact…

【NOIP2016】魔法阵(节选自冬雪_狂舞_桀骜-xmy的博客)

现在来找找AC方式&#xff0c;首先&#xff0c;剖析题目&#xff0c;列出条件&#xff1a;Xa<Xb<Xc<Xd&#xff0c;Xb-Xa2(Xd-Xc)&#xff0c;Xb-Xa<Xc-Xb/3 遇到这种有条件的题&#xff0c;通常把图形画出来比较直观。 如图所示&#xff0c;若把d点确定&#xff0…

Xmy的第二次python(文件操作)

目录 例8-1 利用 os 列出当前目录的绝对路径&#xff0c;及其下的所有子目录、所有文件。 例8-2 利用os.path创建目录、创建多级目录&#xff0c;判断目录、文件是否存在。 例8-3 利用shutil复制、移动目录及文件。 ​向hello.txt中写入10行“Hello World!行号” &#x…

Xmy的Python----Numpy库

目录 例题10-1&#xff1a;创建数组并查看数组属性 构造复杂数组 生成随机数 例题10-2&#xff1a;绘制&#xff1a;随机生成10000数据&#xff0c;服从均值为0&#xff0c;方差为1的正态分布的直方图&#xff08;间隔个数&#xff1a;50&#xff09; 通过索引访问数组 数组的…

python能做的100件事03-python爬虫

文章目录1. scrapy介绍2 新建爬虫项目3 新建蜘蛛文件4 运行爬虫5 爬取内容5.1分析网页结构5.2 关于Xpath解析5.3 接着解析电影数据5.4 下载缩略图5.5 完整代码6 最后说明本例基于python3和scrapy爬虫框架&#xff0c;不再介绍python的基础知识和爬虫的基本知识。1. scrapy介绍 …

亚马逊FBA问题分析

FBA是亚马逊提供物流配送服务的&#xff0c;使用亚马逊FBA能提高产品搜索权重&#xff0c;最重要的是使用亚马逊FBA能提升用户体验。 然而&#xff0c;FBA补货对于部分卖家来说问题较多&#xff0c;常见的有以下问题&#xff1a; 1、不同SKU的补货周期不一样。经常出现补完一个…

FBA_Matting(2020)

FBA_Matting&#xff08;2020&#xff09; 网络结构&#xff1a; 主要是一个Unet网络结构&#xff0c;编码encoder网络使用的是resnet-50&#xff0c;权重用imagenet训练的模型。相比于原始resnet-50有两处修改&#xff0c;a、输入从3通道改为9通道&#xff0c;其中包括rgb与3…

标签打印机打印亚马逊外箱FBA标签

如何把亚马逊FBA后台生成的6个一页的外箱标签拆分打印&#xff1f; 做过亚马逊的都知道。发FBA是后台会生成6个一页的外箱标签或者4页一个的外箱标签或 者1页一个的外箱标签&#xff0c;怎么将这些外箱标签拆分&#xff0c;使用10cm10cm热敏纸或铜版纸在条码标签打印机上打印&…

fba海运详解:fba海运是什么意思,FBA海运费用怎么算

FBA海运是指通过海运将货物运送到亚马逊仓库&#xff0c;FBA海运除了按照海运包税方式计算方法和海运不包税计算的渠道外&#xff0c;还会按货物的实重和体积重量来计算。FBA货运代理的操作流程是通关海运到目的港&#xff0c;然后通关送到亚马逊仓库。一、FBA海运什么意思 FBA…

fba海运是什么意思?FBA海运费用怎么算?

FBA海运是指通过海运将货物送到到亚马逊仓库&#xff0c;FBA货运代理的操作流程是通关海运到目的港&#xff0c;然后清关派送到到亚马逊仓库。FBA海运费用按照FBA海运包税渠道计算方式和FBA海运的不包税渠道计算方式&#xff0c;另外FBA海运会按实际重量和体积重这两者中的最大…

fba开发坑

坑 token失效登录框不消失问题 如果写在success里&#xff0c;框不消失进行跳转登录页面&#xff0c;登录成功后回来还显示请登录提示&#xff0c;导致无限登录的情况。 解决&#xff1a;把跳转方法放到complete里&#xff0c;等弹窗结束后再跳这个方法不行&#xff0c;得使用…