志在指尖
用双手敲打未来

C#中的异步编程

前言
await与async是C#5.0推出的新语法,关于await与async有很多文章解说。但看完后有没有这样一种感觉,感觉这东西像是不错,但好像就是看不太懂,也不清楚该怎么运用。虽然偶有接触,但是一直都没有真实搞理解。
我也是才刚刚摸索理解,把学习成果和我们探讨一下看掌握得对不对。个人的学习习气就是,有杂乱的东西能够简略说理解,就会分享出来~
要点
在学习async/await最难的是什么呢?就是理解它的工作方式!
1.一切的async办法回来类型必定是Task或Task,这是异步处理的根底!
2.在async办法中遇到await要害字后,当前线程立即回来(到调用方),持续之前的处理逻辑;await要害字之后的代码逻辑,将交由新的线程处理;当新的线程处理完结后,能够重新的线程回来处理成果到调用(处)线程傍边,结束等候。
3.在一个async办法中,会依据await要害字进行分割,拆分到不同的线程处理同一个办法的不同部分!
4.把一个办法代码的不同部分拆分到多个线程处理,这是异步办法和同步办法的最大不同!
把上面几点搞理解了,其实异步编程也就大约清楚了吧。。
简略异步调用
classProgram
{staticvoidMain(string[]args)
{
Console.WriteLine(“{0}->Main.异步办法履行前”,Thread.CurrentThread.ManagedThreadId.ToString());//输出异步处理之前的线程IDDoAsync(1000).Wait();//履行异步处理,并等候该异步办法履行完结后才持续Console.WriteLine(“{0}->Main.异步办法履行后”,Thread.CurrentThread.ManagedThreadId.ToString());//输出异步处理之后的线程IDConsole.Read();
}//////履行异步处理//////模仿处理时长///publicstaticasyncTaskDoAsync(inttimes)
{
Console.WriteLine(“{0}->DoAsync.await之前”,Thread.CurrentThread.ManagedThreadId.ToString());//输出调用线程IDawaitTask.Run(()=>Thread.Sleep(times));///履行一个异步任务,并等候回来成果才持续;需求注意的是,调用线程履行到这一行的时分其实就现已回来了Console.WriteLine(“{0}->DoAsync.await之后”,Thread.CurrentThread.ManagedThreadId.ToString());//异步操作履行完了,但这里现已是新的线程了}C#
}
1->Main.异步办法履行前1->DoAsync.await之前3->DoAsync.await之后1->Main.异步办法履行后
请留意异步办法DoAsync的处理,在await之前和await之后,现已是两个不一样的线程ID。
也就是说,一个办法内部被拆分成了多个部分,不同的部分分别由不同的线程处理。
有回来值的异步调用
classProgram
{staticvoidMain(string[]args)
{
Console.WriteLine(“{0}->Main.异步办法履行前”,Thread.CurrentThread.ManagedThreadId.ToString());//输出异步处理之前的线程IDvarasyncTask=DoAsync(1000);//异步履行处理Console.WriteLine(“{0}->Main.异步办法履行后”,Thread.CurrentThread.ManagedThreadId.ToString());//输出异步处理之后的线程IDvarresult=asyncTask.Result;//等候异步处理完结才持续Console.WriteLine(“{0}->Main.异步办法完结后”,Thread.CurrentThread.ManagedThreadId.ToString());//输出异步完结之后的线程IDConsole.Read();
}//////履行异步处理//////模仿处理时长///publicstaticasyncTask<int>DoAsync(inttimes)
{
Console.WriteLine(“{0}->DoAsync.await之前”,Thread.CurrentThread.ManagedThreadId.ToString());//输出调用线程IDvarresult=awaitTask.Run(()=>{Thread.Sleep(times);returntimes;});///履行一个异步任务,并等候回来成果才持续;需求注意的是,调用线程履行到这一行的时分就现已回来了Console.WriteLine(“{0}->DoAsync.await之后”,Thread.CurrentThread.ManagedThreadId.ToString());//异步操作履行完了,但这里现已是新的线程了returnresult;//回来计算成果,注意:回来成果时和进入办法时的线程现已不一样了}
}
1->Main.异步办法履行前1->DoAsync.await之前1->Main.异步办法履行后3->DoAsync.await之后1->Main.异步办法完结后
请注意:在同步办法Main中履行的时分都是同一个线程;在异步办法DoAsync履行的时分,在await之前是调用线程,在await之后则是另一个线程。
总结
在异步(async)办法履行中,会依据await要害字,拆分一个办法为多个部分,分别由不同的线程履行。
在异步(async)办法履行中,遇到await要害字,调用线程会立即回来(线程池)持续后续的处理逻辑;然后,调用方能够运用Task.Wait()或Task.Result进行堵塞,等候异步办法履行结束再持续。
在异步(async)办法履行后,若不运用Task.Wait()进行等候,或不运用Task.Result获取回来成果,则该办法将仅以异步方式履行。

未经允许不得转载:IT技术网站 » C#中的异步编程
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载