线程处理模型 由于 SynchronizationContext 引起的死锁问题解决
由于GUI 应用程序 不能使用线程池的线程更新UI,只能使用 GUI 线程更新,所以在 await 前后需要保证是同一个 GUI 线程
ASP.NET 程序 的线程处理客户端请求的时候,需要假定客户端的语言文化和身份标识等,所以为了保证信息的统一性,await 前后 会用同一个线程来处理...
那么,在 FCL 的 SynchronizationContext 就使用这样的线程模型来解决以上问题。因此偶尔也会带来一些问题:如下,
protected void Page_Load(object sender, EventArgs e)
{
try
{
Task<string> t = GetPage();
//主线程等待异步方法结束
Response.Write(t.Result);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
} private async Task<string> GetPage()
{
WebRequest req = WebRequest.Create("http://www.baidu.com/");
//线程返回
WebResponse resp = await req.GetResponseAsync();
//等待执行,但是永远执行不到,因为 需要同一个主线程执行,但是主线程在等待该方法执行结束, 死锁!!!
Stream stream = resp.GetResponseStream();
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
由于很多应用程序不需要依赖特定的应用程序模型,所以避免使用SynchronizationContext 对象,所以用 ConfigureAwait() 方法解决死锁问题
protected void Page_Load(object sender, EventArgs e)
{
try
{
Task<string> t = GetPage();
//主线程等待异步方法结束
Response.Write(t.Result);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
} private async Task<string> GetPage()
{
WebRequest req = WebRequest.Create("http://www.baidu.com/");
//ConfigureAwait(false) 不依赖 线程处理模型,可用线程池线程唤醒状态机
WebResponse resp = await req.GetResponseAsync().ConfigureAwait(false);
Stream stream = resp.GetResponseStream();
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
线程处理模型 由于 SynchronizationContext 引起的死锁问题解决的更多相关文章
- JavaScript 学习笔记之线程异步模型
核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...
- 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)
前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- Java线程:线程栈模型与线程的变量
Java线程:线程栈模型与线程的变量 要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运 ...
- C#线程系列讲座(4):同步与死锁
虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用.让我们先看看如下的代码: class Increment { private int n = 0; ...
- Java线程:线程栈模型
要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运 ...
- Linux 线程实现模型
1.Linux 线程的调度实现可以有两种模型, 一种是完全由进程负责,进程内启动一个线程调度器,由进程内的线程调度器完成调度. 缺点是:(1)各个线程自己加主动释放cpu的流程 (2)进程可能阻塞,达 ...
- [并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]
Pthread线程使用模型之三 客户端/服务端模型(Client/Server) 场景 1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– ...
- [并发并行]_[线程模型]_[Pthread线程使用模型之二 工作组work crew]
Pthread线程使用模型之二工作组(Work crew) 场景 1.一些耗时的任务,比如分析多个类型的数据, 是独立的任务, 并不像 pipeline那样有序的依赖关系, 这时候pipeline就显 ...
随机推荐
- 双日历时间段选择控件—daterangepicker(汉化版)
daterangepicker的配置信息,记录下来方便设置: <pre name="code" class="html"><pre name= ...
- 鼠标右击.exe的程序出现闪退(桌面重启)怎么办
桌面鼠标右击,然后点NVIDIA控制面板(或者按windows+S组合键,在底下输入NVIDIA,然后点NVIDIA控制面板) 好了,然后任意找个文件试试...如图,问题完美解决
- mongodb安装、启动、远程连接
1.现在mongodb安装包 mongodb-linux-x86_64-3.0.6.tgz 2.解压缩安装包 tar zxvf mongodb-linux-x86_64-3.0.6.tgz /opt ...
- R语言环境安装与基本使用
R语言安装包可以从这个地址选择合适的URL去下载:https://cran.r-project.org/mirrors.html,这里使用这个https://mirrors.tuna.tsinghua ...
- Awesome
DotNet 资源大全中文版(Awesome最新版) http://www.cnblogs.com/best/p/5876596.html Java资源大全中文版(Awesome最新版) http:/ ...
- IIS配置域用户自动登录
1.首先确定IIS所在计算机是否已添加到域中:右击计算机->属性,在计算机名称,域,工作组设置中可看到计算机所在的域,若没有,可点击更改设置,再点击更改,选择要绑定的域即可(需要用域账户登录). ...
- 剑指Offer-【面试题02:实现Singleton 模式——七种实现方式】
题目:设计一个类,我们只能生成该类的一个实例 package com.cxz.demo02; /** * Created by CXZ on 2016/9/13. */ public class Si ...
- [转]序列化悍将Protobuf-Net,入门动手实录
最近在研究web api 2,看了一篇文章,讲解如何提升性能的, 在序列化速度的跑分中,Protobuf一骑绝尘,序列化速度快,性能强,体积小,所以打算了解下这个利器 1:安装篇 谷歌官方没有提供.n ...
- sql中查询中的when...then 语句
),jbrq, ),'/','-')as jbrq, ' then '启用' when ' then '未启用' else '修改' end cbzt,shzt from jc_yscbfxb sel ...
- java中注解的使用与实例 (二)
java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...