记录对.net异步的理解

最近在学习.net framwork的异步,看了很多博客,也学习了很多,不过在MSDN上关于在UI上await造成的死锁不是很理解,经过今天上午的思考,才感觉自己被单线程的执行流程局限了,当然也记录下来我自己的思考过程

首先贴一下MSDN的文章地址

https://msdn.microsoft.com/zh-cn/magazine/hh456402.aspx

以及我之前疑问的代码段

下面是关于这块逻辑的理解的流程图

流程解释

首先按钮的onlick事件触发,之后第一步执行的是UI的主线程,之后到达 CopyStreamToStreamAsync方法,

CopyStreamToStreamAsync方法体

在这之前都是同步线程,之后CopyStreamToStreamAsync由于异步的原因,开始进行异步执行,主线程继续执行,直到t.waiit()方法,主线程被阻塞,这个时候异步方法并没有忽略UI线程的上下文,到达方法体的await方法时,异步的执行规则是要

捕获上下文,也就是要回到UI主线程中,恰恰这个时候主线程被阻塞了,而wait()方法本身是等待Task任务执行完毕后再执行的,这个时候就会导致,双方无条件的等待彼此结束,而造成死锁

MSDN上的解决方案是忽略UI的上下文,这样让任务运行在线程池的上下文中来避免死锁

				
时间: 2025-01-14 06:15:50

记录对.net异步的理解的相关文章

jquery的ajax同步和异步的理解及示例

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除. 而异步则这个AJAX代码运行中的时候其他代码一样可以运行. jquery的async:false,这个属性 默认是true:异步,false:同步. 复制代码代码如下: $.ajax({ type: "post", 

C语言中同步和异步的理解

现在我在main.c这个文件中,调用360浏览器. 分析过程:在my.exe里面继续打开另外一个程序,所以就涉及到:my.exe的继续执行是否要等把另外的那个程序执行完才执行呢?如果要等,就是同步:如果不用等,就是异步.这就是同步和异步的问题. 现在是要等的情况: 结果就是要等到浏览器完全打开完才会去打印nihao . 如果这样看,就会更加的清晰: 结果是: 一个一个的打开,最后才是打印nihao 如果要异步方式: 结果是: 三个浏览器几乎同时打开,同时"nihao"还会先打印出来.

集千篇理论精华,感悟对同步和异步的理解

一.promise本身是同步还是异步呢? 众所周知,Promise是ES6提出的解决异步编程导致陷入回调地狱问题的,那么Promise是同步的还是异步的?可以确定的是,Promise本身是同步的,而他的.then和.catch为异步的. 举个栗子: console.log(1) let a = new Promise((res,rej) => { console.log(2); }); console.log(3); let b = new Promise((res,rej) => { con

Spring学习记录(十二)---AOP理解

Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 专业术语: Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spri

nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏.因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64的二维数组,更新显示时将整个数组刷新到屏幕上),而且这两个OLED是串口的(还有一个128X32的OLED,一样串口的,连驱动时序和驱动函数都一样,两个都太小了,还那么贵......),四个IO口就能驱动(两个还是供电的VCC和GND),所以不像之前的那个mini 12864屏幕,它是8位并口的,带

关系数据库范式粗略理解

粗略看了一下关系数据库范式介绍,简单记录一下自己的理解 第一范式:指属性达到原子性,即属性不可再进行分割了.例如一张person 表,其中有个字段是个人信息p_info,这个个人信息可再分割成姓名,性别,年龄三个字段.那么person这张表就没有达到第一范式,应把个人信息分解成姓名,性别,年龄之后才算达到第一范式. 第二范式:指在达到第一范式的基础上,非主属性完全函数依赖于主属性,就好比表中设了主键,主键之外的属性完全依赖于主属性.完全函数依赖指 x决定y,但是x的任意一个子集都不能决定y.即若

C++ 模板特化以及Typelist的相关理解

近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值!!这是题外话.这本书十分经典.其内容对于一个C++新手来说需要时间来理解吸收.在这里记录一下自己的理解.日后发现错误会给予更正.如有有人碰巧看到了.欢迎指正. 参考了http://blog.csdn.net/gatieme/article/details/50953564 整篇内容分了三个部分:1

邻接表理解

http://developer.51cto.com/art/201404/435072.htm 这篇文章讲邻接表讲的很好.记录一下自己的理解. 邻接表用的是链式存储结构,根据图很好理解,但是一看代码就懵了.拿原文提到的一个数据举例: 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 四个顶点5条边,自然可以先拿u[],v[],w[]数组记录每条边,因为要用数组模拟链表,所以想到可以开两个数组first[],next[](初始化都为-1),first[]存的是以顶点为起始点的最

重新理解:ASP.NET 异步编程(转)

http://www.cnblogs.com/xishuai/p/asp-net-async-await-and-exception-handling.html 相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在做异步测试的时候,又对 ASP.NET 异步有了新的认识,可以说自己之前对异步的理解还是有些问题,先列一下这篇博文的三个解惑点: async await 到底是什么