异步编程的学习

常见的三种异步编程

  1. EAP

基于事件的异步程序。比如下载完成后事件的处理函数会执行,也就是说一个异步方法配一个执行事件,优点是简单,缺点是当实现复杂的业务的时候很麻烦。

private void button1_Click(object sender, EventArgs e)

{

//eap基于事件的异步编程

//EAP异步编程 当下面的代码下载完成后,并不是提交后完成的,而是在事件中处理提示完成的

//也就是EAP编程中一个异步方法配一个异步事件,当方法提交后,剩下的由事件来处理

WebClient wc = new WebClient();

wc.DownloadStringCompleted += wc_DownloadStringCompleted;

wc.DownloadStringAsync(new Uri("http://www.xiaojun.fun"));

}

2、APM

使用了APM的异步方法后会返回一个IAsyncResult的对象,这个对象有一个很重要的属性AsyncWaitHandle他是一个用来等待异步执行完成结束的一个同步信号。(Stream,SqlCommand,Socket都有)

private void button2_Click(object sender, EventArgs e)

{

//APM 使用Apm的异步方法后会返回一个IAsyncResult的对象

//这个对象有一个很重要的属性AsyncWaitHandle,他是一个用来等待异步执行完成的同步信号

FileStream fs = File.OpenRead("d:/1.txt");

byte[] buffer = new byte[1000000];

IAsyncResult result = fs.BeginRead(buffer, 0, buffer.Length, null, null);//开始

result.AsyncWaitHandle.WaitOne();//等待执行完成

fs.EndRead(result);//回收

textBox1.Text = Encoding.UTF8.GetString(buffer);

}

3、TPL

TPL(Task Parallel Library)是.Net 4.0 之后带来的新特性,更简洁,更方便

TPL方法中如果有await(),则方法必须标记为async结尾的。

特点:方法都是以什么什么async结尾,返回的都是泛型Task<T>类型

Task: Task可以简单的理解为一个线程的封装,就相当于一个任务,程序提供一个任务给Task去执行,Task在执行的时候回马上返回主线程,当任务执行完成后就会告诉主线程,并继续执行Task后面的代码,异步执行。

/// <summary>

/// 异步方法 tpl

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void button3_Click(object sender, EventArgs e)

{

//TPL 基于任务的异步编程 简单的实现

FileStream fs = File.OpenRead("d:/1.txt");

byte[] buffer = new byte[1000000];

Task<int> t = fs.ReadAsync(buffer, 0, buffer.Length);//返回一个Task的泛型

t.Wait();//等待完成

textBox1.Text = Encoding.UTF8.GetString(buffer);

}

自己手动编写异步方法

返回的值为Task<T>,一般命名规则是方法都是以Async结尾的

/// <summary>

/// 自己编写异步方法

/// </summary>

/// <returns></returns>

static Task<string> TestAsync()

{

return Task.Run(() => "测试收到编写");

}

/// <summary>

/// 测试调用自己的异步方法

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private async void button5_Click(object sender, EventArgs e)

{

string result =await TestAsync();//异步获取返回值

MessageBox.Show(result);

}

原文地址:https://www.cnblogs.com/xiaojunwu/p/12704662.html

时间: 2024-10-04 11:19:18

异步编程的学习的相关文章

&lt;史上最强&gt;深入理解 Python 异步编程(上)

前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成了 Python 生态下一阶段的主旋律.如新兴的 Go.Rust.

深入理解 Python 异步编程(上)

http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成

Node.js学习笔记【3】NodeJS基础、代码的组织和部署、文件操作、网络操作、进程管理、异步编程

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

深入浅出nodejs学习笔记——异步编程

高阶函数:与传统函数只能传递或返回规定的数据类型相比,高阶函数可以返回函数,如下: function foo(x){ return function(){ return x; } } 由于高阶函数可以传递函数为参数,因此可以传递不同类型的函数来实现不同的功能,更加灵活 使用偏函数,如果要创建一组函数,比如isFunction,isString等功能类似的函数,如果每个都独自定义会很麻烦,可以使用统一的方式定义,通过参数的传递让这个函数像工厂一样生产类似的函数,代码如下: var isType =

Node.js学习笔记(2)——关于异步编程风格

Node.js的异步编程风格是它的一大特点,在代码中就是体现在回调中. 首先是代码的顺序执行: function heavyCompute(n, callback) { var count = 0, i, j; for (i = n; i > 0; --i) { for (j = n; j > 0; --j) { count += 1; } }callback(count); } heavyCompute(10000, function (count) { console.log(count)

js学习总结----ajax中的http请求方式及同步编程和异步编程

一.请求方式 var xhr = createXHR(); xhr.open("get","/getList?num=12",true); xhr.open("post","/getList",true); xhr.send('{"name":"zhangsan","age":7}') //HTTP METHOD;客户端向服务器端发送请求的方式 //以下的请求方式不管

nodejs学习笔记 —— 异步编程解决方案

在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听器模式是一种广泛用于异步编程的模式, 是回调函数的事件化,又称发布/订阅模式, node自身提供events模块,是该模式的一个简单实现. EventPorxy 2.promise/deferrd模式 在2009年被Kris Zyp抽象为一个提议草案,发布在CommonJS规范中, 目前,Commo

JavaScript学习--Item27 异步编程异常解决方案

1.JavaScript异步编程的两个核心难点 异步I/O.事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络.文件访问功能,且使之在后端实现了较高的性能.然而异步风格也引来了一些麻烦,其中比较核心的问题是: 1.函数嵌套过深 JavaScript的异步调用基于回调函数,当多个异步事务多级依赖时,回调函数会形成多级的嵌套,代码变成 金字塔型结构.这不仅使得代码变难看难懂,更使得调试.重构的过程充满风险. 2.异常处理 回调嵌套不仅仅是使代码变得杂乱,也使得错误处理更复杂.这

ES6/7 异步编程学习笔记

前言 在ES6的异步函数出现之前,Js实现异步编程只有settimeout.事件监听.回调函数等几种方法 settTmeout 这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPIs功能,因此与主线程并不同,当延时方法到达触发条件时,方法被添加到用于回调的任务队列,只要执行引擎栈中的代码执行完毕,主线程就会去读取任务队列,依次执行那些满足触发条件的回调函数.所以其等待时间在某些情况下往往不是那么准备,这一方面推荐可以看看<你不知道的js>这方面的章节. 事件监听 这一个方法