由于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 引起的死锁问题解决的更多相关文章

  1. JavaScript 学习笔记之线程异步模型

    核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...

  2. 基于java.util.logging实现轻量级日志记录库(增加根据当前类class初始化,修复线程池模型(javaEE)下的堆栈轨迹顺序与当前调用方法不一致问题)

    前言: 本章介绍自己写的基于java.util.logging的轻量级日志记录库(baseLog). 该版本的日志记录库犹如其名,baseLog,是个实现日志记录基本功能的小库,适合小型项目使用,方便 ...

  3. java线程内存模型,线程、工作内存、主内存

    转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...

  4. Java线程:线程栈模型与线程的变量

    Java线程:线程栈模型与线程的变量   要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运 ...

  5. C#线程系列讲座(4):同步与死锁

    虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用.让我们先看看如下的代码:     class Increment     {         private int n = 0;   ...

  6. Java线程:线程栈模型

    要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运 ...

  7. Linux 线程实现模型

    1.Linux 线程的调度实现可以有两种模型, 一种是完全由进程负责,进程内启动一个线程调度器,由进程内的线程调度器完成调度. 缺点是:(1)各个线程自己加主动释放cpu的流程 (2)进程可能阻塞,达 ...

  8. [并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]

    Pthread线程使用模型之三 客户端/服务端模型(Client/Server) 场景 1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– ...

  9. [并发并行]_[线程模型]_[Pthread线程使用模型之二 工作组work crew]

    Pthread线程使用模型之二工作组(Work crew) 场景 1.一些耗时的任务,比如分析多个类型的数据, 是独立的任务, 并不像 pipeline那样有序的依赖关系, 这时候pipeline就显 ...

随机推荐

  1. c/c++ 缓冲区的刷新

    利用string 对象查看缓冲区的变化,因为每个string对象在输入时会以空格作为分界. #include<iostream> #include<string> using ...

  2. CPrimerPlus第11章第10题

    题目: 编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程.这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表.按ASCII顺序输出字符串.按 ...

  3. JavaScript 学习笔记——cssText

    平常编写代码,更改一个元素样式的时候,自己都是用 obj.style.width = "200px"; obj.style.position = "absolute&qu ...

  4. xml in SQL

    几年前,学习html时,顺便把xml也学了哈,知道了xpath和xquery的概念,可都没去落实,下面这篇文章,可以学习学习 http://www.cnblogs.com/huyong/archive ...

  5. android UI控件小记

    1.关于text和drawableTop之类的间距 android:drawablePadding="10dp" 2.EditText属性 android:phoneNumber= ...

  6. javaScript事件(一)事件流

    一.事件 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.事件是javaScript和DOM之间的桥梁.你若触发,我便执行——事件发生,调用它的处理函数 ...

  7. 谷歌浏览器对uploadify(swf)上传控件 崩溃问题

    页面加上 <script type="text/javascript" src=@Url.Content("~/Content/js/jquery.uploadif ...

  8. [C#].NET中几种Timer的使用

    这篇博客将梳理一下.NET中4个Timer类,及其用法. 1. System.Threading.Timer public Timer(TimerCallback callback, object s ...

  9. ACM进阶计划

    ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...

  10. Nginx - 配置

    1 自动显示目录 autoindex on; 1.1 显示文件大小 autoindex_exact_size off; 默认为on,显示出文件的确切大小,单位是bytes. 改为off后,显示出文件的 ...