线程处理模型 由于 SynchronizationContext 引起的死锁问题解决
2024-10-11 22:49:41
由于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();
}
最新文章
- [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图
- XML文件操作(C#)
- eclipse for jee版配置tomcat
- Flex +WebService
- C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化
- HTMLTestRunner生成空白resault.html
- SOA和微服务
- UVa 679 小球下落 简单模拟题,树
- 创建理想的SEQUENCE和自增长的trigger
- sass 与 less 的区别与学习
- app.config 配置多项 配置集合 自定义配置(4) 自动增加配置项到配置文件的两种方法
- Beta冲刺NO.7
- git 解决每次更新代码都要输入用户名密码的解决方案
- C# 创建Web项目时 可以选择的类型在不同VS版本下的对比
- 使用jquery实现文本框输入特效:文字逐个显示逐个消失反复循环
- Confluence 6 从站点首页集中访问面板
- 常见的排序算法(直接插入&;选择排序&;二分查找排序)
- Python推荐系统库--Surprise理论
- 008、Docker 组件如何协作(2018-12-25 周二)
- JAVA编程思想学习笔记3-chap7-9-斗之气3段