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

在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. CentOS7.6 如何设置静态ip

    [root@localhost network-scripts]# cd /etc/sysconfig/network-scripts/[root@localhost network-scripts] ...

  2. Python全栈开发-Day6-面向对象编程

    本节内容: 面向过程VS面向对象 面向对象编程介绍 类的语法 构造函数.析构函数 私有方法.私有属性 面向对象的特性:封装.继承.多态 1.面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法 ...

  3. Linux中apt与apt-get命令的区别与解释

    2019-01-15 14:35:39 随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版 ...

  4. Docker用途 & 和tomcat的区别

    两者不是同一种类型.1.docker 是容器,tomcat是jsp应用服务器2.tomcat可以安装在物理机上,虚拟机上,也可以安装在Docker上.所以从这个角度讲,Docker也可以看做是一种超轻 ...

  5. Superclass和Constructor Chaining

    A subclass inherits accessible date fields and methods from its superclass. Does it inherit construc ...

  6. delphi 条形码

    Delphi中打印条码的方法 导读: 1 通过菜单”Component”下的”Import ActiveX”将“Microsoft Access Barcode Control 9.0”控件引入.这个 ...

  7. English trip EM2-PE-1B Teacher:Patirck

    PE = 演讲课 课上内容(Lesson) How are you today?  你今天怎么样? What is your name?  你的名字叫什么? What do you come from ...

  8. SE-Net要点

    关于SE-Net有些很奇妙的点: 1.首先,所谓的SE module加在了BN层后面,这样的话,SE首先应该是对于BN层输出的feature map求取global average pooling,一 ...

  9. 『MXNet』专题汇总

    MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...

  10. spring boot(一)入门

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...