async

彻底搞懂 C# 的 async/await

独自空忆成欢 提交于 2019-12-05 12:20:14
前言 # Talk is cheap, Show you the code first! Copy private void button1_Click(object sender, EventArgs e) { Console.WriteLine("111 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId); AsyncMethod(); Console.WriteLine("222 balabala. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId); } private async Task AsyncMethod() { var ResultFromTimeConsumingMethod = TimeConsumingMethod(); string Result = await ResultFromTimeConsumingMethod + " + AsyncMethod. My Thread ID is :" + Thread.CurrentThread.ManagedThreadId; Console.WriteLine(Result); //返回值是Task的函数可以不用return } /

.NET进阶篇06-async异步、thread多线程3

你离开我真会死。 提交于 2019-12-05 11:21:54
知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂 梯子 一、任务Task 1、启动任务 2、阻塞延续 3、任务层次结构 4、枚举参数 5、任务取消 6、任务结果 7、异常 二、并行Parallel 1、Parallel.For()、Parallel.ForEach() 2、Parallel.For 3、Parallel.Invoke() 4、PLinq 三、异步等待AsyncAwait 1、简单使用 2、优雅 3、最后 一、任务Task System.Threading.Tasks在.NET4引入,前面线程的API太多了,控制不方便,而ThreadPool控制能力又太弱,比如做线程的延续、阻塞、取消、超时等功能不太方便,所以Task就 抽象了线程功能,在后台使用ThreadPool 1、启动任务 可以使用TaskFactory类或Task类的构造函数和Start()方法,委托可以提供带有一个Object类型的输入参数,所以可以给任务传递任意数据 TaskFactory taskFactory = new TaskFactory();taskFactory.StartNew(() => { Console.WriteLine($"tid={Thread.CurrentThread.ManagedThreadId},datetime={DateTime.Now}");})

IntentService类 和 异步任务(AsyncTask)

£可爱£侵袭症+ 提交于 2019-12-05 08:27:04
IntentService是一个Service类。 IntentService只有1个带String参数的构造方法,所以,在自定义类继承IntentService时,需要在自定义类中显式的调用IntentService带参数的构造方法,并且将自定义类的构造方法修改为无参数的。 IntentService内部使用消息机制,利用消息队列的特性,可以依次处理多个耗时操作。 IntentService具有生命力强、一次性使用、依次处理多个耗时操作的特性。 注意:在自定义类继承IntentService时,可以重写IntentService的生命周期方法,但是,不可以删除super语句 IntentService与ResultReceiver ---------------------------------- ResultReceiver可以实现组件间的通信 【开发流程】 1. 自定义类继承IntentService,显式的定义无参数的构造方法,并注册 2. 在接收结果的类(例如Activity类)中自定义内部类继承ResultReceiver 3. 在需要IntentService执行任务时,使用startService()激活Service组件,并且,将自定义的ResultReceiver对象封装到用于激活IntentService的Intent对象中 4.

C# 之 async / await

戏子无情 提交于 2019-12-05 07:11:28
直接看一个例子 private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { Thread.Sleep(5000); return "Hello"; }); this.Text = await t; } 单机按钮后,程序执行到 this.Text = await t 会直接返回到调用方法的地方继续执行,t方法异步执行返回后执行 this.Text = await t ,效果就是点击按钮后界面不会卡死,方法执行完后 this.Text 更改。 async修饰的方法返回值类型必须是 void、Task或Task<TResult>。方法内部必须含有await修饰的方法,如果方法内部没有await关键字修饰的表达式,哪怕函数被async修饰也只能算作同步方法,执行的时候也是同步执行的。 Task<TResult>是有返回值的, void和Task没有返回值,使用Task可以让外层函数拿到异步函数,从而调用await等待异步函数执行完毕。(个人理解) https://www.cnblogs.com/zhaoshujie/p/11192036.html 来源: https://www.cnblogs.com/wintertone/p/11913069.html

GCD 面试题

血红的双手。 提交于 2019-12-05 04:41:14
今天我们讲解几道这两天遇到的面试题--GCD编程的.题目很不错,很考究关于GCD的基本概念和使用. 对于基本的概念,本人博客已在前面讲过,本篇主要以面试题来讲解.大家可看一下本人关于GCD的基本讲解 https://www.cnblogs.com/guohai-stronger/p/9038567.html GCD编程的核心就是dispatch队列, dispatch block的执行都会最终放到某个队列中执行.我们直接以题目来讲解: 【例1】GCD面试题1 - (void)viewDidLoad { [super viewDidLoad]; [self testGCD]; } - (void)testGCD { //并行队列 dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); } 讲解 : 首先看创建队列是 并行 队列,无需等待; 首先打印出 1 ,然后看dispatch_async,将dispatch

自己动手写压力测试-三剑客HttpClient+Async+Parallel

瘦欲@ 提交于 2019-12-05 04:20:40
曾经沧海难为水 信息如水 压力如潮 功能实现阶段,我们对得要处理的信息分析得很细致,很透彻,所谓细如丝,透如水。然而,到了产品的阶段,要处理的信息却如同潮洪而至,原本的假设预想,通通被击成了碎片。这时候产生的错误和问题,很难在开发机上重现。 如果说用户验收测试是对功能实现的检查,需要滴水不漏;压力测试则是容量的考验,迎接浪的洗礼。 (本文版权属于© 2012 - 2013 予沁安 ) 环肥燕瘦 压力测试的工具颇多,尤其是HP的LoadRunner甚至成为了行业标准。可是,在研究和考察的过程中,心里却慢慢有了质疑,我是否非得用这些工具吗? 一则,它们是商业软件,价格不菲;二则,还是因为是商业软件,功能太多,太庞大,很多东西我都不需要。为什么不自己做一个简单实用的呢? 在 小赵研究Selenium 时,我觉得用他用的语法很贴近业务语言,于是我提出一个问题,可以用于压力测试吗?他说不行,因为Selenium是要完全启动浏览器。平时,看起来瘦小的浏览器,其实很耗资源,特别是与压力测试的容量来比,浏览器是个不折不扣的大胖子。你可以试一下,在你的机器上同时开启100个浏览窗口,会是个什么状况。 苗条美人 HttpClient 否定了Selenium之后,很快就找到了我的目标HttpClient (其实还有个前生WebClient,后面有叙)。从名称,我们就可以知道,它已经定位到很低Http层

微信小程序异步回调

白昼怎懂夜的黑 提交于 2019-12-05 03:56:36
场景如下:现有一个方法需要等待其他N个异步函数执行完毕后执行,callback麻烦的头大,翻了一波API原来小程序已经支持 async函数,那一切就好办了。 废话不多说,直接开始撸。。。 第一步:打开增强编译 第二部:直接撸代码,这里写了个🌰   wait:function() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('ajax请求等待') }, 2000) }) }, onLoad: async function(options) { let ajaxTime = await this.wait(); console.log(ajaxTime) let getIndex = this.getArrIndex(this.data.sexArray, 'other.其他'); console.log('异步执行后获取index:'+getIndex) this.setData({ sexindex: getIndex }) }, 上面的执行顺序是: 先执行:this.wait(),进入函数体,然后进入等待 2秒后执行:console.log(ajaxTime) 下面的代码则按照基本的js执行顺序执行。 来源: https://www.cnblogs.com/xqfffffff/p

React native 之 async/await

独自空忆成欢 提交于 2019-12-05 03:54:43
参考资料 :https://www.jianshu.com/p/1e75bd387aa0 要点: 1. async function(){} 将普通函数转换成Promise 2. await 表达式/函数 强制等待后面的结果返回再继续 3. await 只能用在async function(){}中 ,用在普通函数中会报错 async function add1(x){   let a =1;   return x+a; } add1(10) Promise {<resolved>: 11} async声明add1是一个Promise,执行函数,可以看出 add1(10)的返回值是一个resoved的Promise function pm(){ return new Promise((resolve,reject)=>{ resolve('1') }) }; async function test(){ let a = await pm(); let b = await '2'; console.log(a) console.log(b) return a+b; } test() 1 2 Promise {<resolved>: "12"} 4. 报错处理:最好把await 放入try ... catch ... 中 function timeout(ms) { return

Java Async IO Library: Quasar (use Channel)

青春壹個敷衍的年華 提交于 2019-12-05 03:30:46
前言 你如果熟悉go ,fiber (对于fiber可以简单理解成为轻量级线程)和 channel 就对应go 的goroutines 和channel,在go语言中用法如下: package main import "fmt" func sum(s []int, c chan int) { //方法执行体 sum := 0 for _, v := range s { sum += v } c <- sum // send sum to c } func main() { //main 函数 s := []int{7, 2, 8, -9, 4, 0} // 构建一个数组 c := make(chan int) //新建一个channel go sum(s[:len(s)/2], c) // 新起一个协程,然后在协程中执行方法,相当于new 一个fiber go sum(s[len(s)/2:], c) // new 一个fiber 。。 x, y := <-c, <-c // receive from c // 通过channel来传递消息 fmt.Println(x, y, x+y) } fiber example: Channel<Object> objectChannel = Channels.newChannel(0); // 0 ,receive() block

C#版本与.NET版本对应关系以及各版本的特性

元气小坏坏 提交于 2019-12-05 03:03:30
   前提声明:C# 5.0 .NET Framework 4.5 2012-08-15 异步和等待(async和await)、调用方信息(Caller Information) ( C#版本与.NET版本对应关系以及各版本的特性 ).,所以VS2010及其以前的版本都是不行的。 两段代码直接看出名堂: class Program { static void Main(string[] args) { //PaintBody(); //PaintBodyAsync(); Console.WriteLine("End"); } static async Task PaintBodyAsync() { Console.WriteLine("Header"); //就是遇到awaIt,这里面的东西不会阻塞,继续执行 await Task.Run(() => { //System.Threading.Thread.Sleep(1000);//线程不管是否睡眠,都是先执行其他方法 Console.WriteLine("Body"); }); Console.WriteLine("Footer"); } static void PaintBody() { Console.WriteLine("Header"); System.Threading.Thread.Sleep(1000);