在异步编程中,如果稍有不注意,就会造成死锁问题。何为死锁:即两个以上的线程同时争夺被互相锁住的资源,两个都不放手。

在UI或asp.net中,容易造成死锁的代码如下所示:

        private void btnSet_Click(object sender, EventArgs e) {
Task<int> task= DelayAsync();
//在同步代码中有wait同步等待函数
task.Wait();
this.Text = "测试";
} private async Task<int> DelayAsync() {
//在异步方法中,有await异步等待函数
await Task.Delay();
return ;
}

当执行btnSet_Click方法时,程序就会造成死锁,this.Text="测试" 这一行代码永远都不会执行。

为何会造成死锁?首先,task.Wait()方法造成了当前主线程被阻塞,其次,DelayAsync方法中的Task.Delay(1000)(由挂起到激活状态)运行结束时会捕获当前的上下文线程,而当前的上下文线程已经被阻塞,故造成死锁。

解决的方法有两个:

1、将btnSet_click变为异步方法,全部采用异步等待的方式;

        private async void btnSet_Click(object sender, EventArgs e) {
int result=await DelayAsync();
this.Text = result.ToString();
} private async Task<int> DelayAsync() {
await Task.Delay();
return ;
}

2、在异步方法中使用Task.ConfigureAwait(false),不将await产生的延时任务送回到原始上下文线程中,即不会去捕获原始上下文,并在其新开辟的线程中结束其代码的运行,如下面的代码。

备注:如果是这种方式,则在异步方法的Task.ConfigureAwait(false)语句之后的代码块中,获取不了原始上下文的某些变量,容易造成NullReferenceException空值引用异常。

        private async void btnSet_Click(object sender, EventArgs e) {
Task<int> task = DelayAsync();
task.Wait();
this.Text = task.Result.ToString();
} private async Task<int> DelayAsync() {
await Task.Delay().ConfigureAwait(false);
return ;
}

c# async/await异步编程死锁的问题的更多相关文章

  1. 【转】C# Async/Await 异步编程中的最佳做法

    Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...

  2. C#中 Thread,Task,Async/Await 异步编程

    什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...

  3. .NET Web应用中为什么要使用async/await异步编程

    前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...

  4. Async await 异步编程说明

    希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await ...

  5. async/await 异步编程(转载)

    转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...

  6. async/await 异步编程

    前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...

  7. c# 关于async/await异步编程的浅析和使用

    线程的同步运行,时效性慢,异步运行,时效性快! 在c#5.0引出了async/await关键字,可以用其来进行异步编程. async/await定义异步方法的语法如下: 1.在方法的返回类型前面加上a ...

  8. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  9. ASP.Net中的async+await异步编程

    在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简 ...

随机推荐

  1. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第四话):把war包远程部署到tomcat

    上一节介绍了如何用Ant插件来打war包,本节接着介绍如何把build好的war自动部署到tomcat中 1.先安装 Deploy to container Plugin插件 2. 在构建后操作中添加 ...

  2. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第一话):初次启动jenkins,输入给定密码后登录失败问题解决

    Jenkins是一个持续集成平台,它能够从git等源码管理服务器拉取代码.打包并发布到tomcat等中间件,只要配置好相关插件,就可以做到项目的自动化构建.部署,不论是对开发来说监控代码质量,还是对测 ...

  3. 雷林鹏分享:查看 XML 文件

    查看 XML 文件 在所有主流的浏览器中,均能够查看原始的 XML 文件. 不要指望 XML 文件会直接显示为 HTML 页面. 查看 XML 文件 - Tove Jani Reminder Don' ...

  4. 本地广播的简单示例 --Android开发

    1.局部通知管理器LocalBroadcastManager,用于同一个应用中不同组件之间发送广播.由于是在同应用中发送广播,所以使用它安全性.效率也会提高. 2.本例实现简单的发送本地广播的案例 点 ...

  5. Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

    本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...

  6. c# 正则表达式如何处理换行符?

    我们要分析网页,把整个网页内容作为匹配源,但是c#的正则表达式是默认以一行为单位的,使用 RegexOptions.Multiline 也没有实质性作用(它知识改变了^和$的行为) 只要在正则表达式前 ...

  7. 邂逅明下 HDU - 2897

    Problem description: 有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完.两人轮流取,直到堆里的硬币取完,最 ...

  8. 笔记react router 4(二)

    上一篇我们提到react router 4的dom特性.那么这一次,我们来说一说4.X中的路由组件嵌套. 用过3.X的同学应该知道,路由组件的嵌套(即,路由的配置)方式是通过给<Route> ...

  9. oracle 基本操作--事务

    事务:可以看做是由对数据可的若干操作组成的一个单元,浙西操作要么都完成,要么都取消,从而保证数据满足一致性的要求. 事务的组成: 一条或者多条DML 一条DDL 一条DCL DML语句需要使用comm ...

  10. CRM ORDER_MAINTAIN

    H: GUID CRMT_OBJECT_GUID RAW CRM 订单对象的 GUID BP_NUMBER BU_PARTNER 业务伙伴编号 FIRSTNAME BU_NAMEP_F 业务伙伴(人员 ...