为什么在global.asax中写入错误日志时要用lock

wyumening 2014-08-29 02:52:35
看到别人写的代码中,是在global.asax中的Application_Error事件中写记录错误日志的代码的,看到用了lock,有点疑惑,asp.net本身是线程的,那么为什么在global.asax中记录错误时要用lock呢?到网上找的资料说当发生错误时,就会触发Application_Error事件,那么在项目实际的运行过程中,会有多个用户访问单个页面,如果该页面中的代码出错,那么都会触发Application_Error,这个时候为了处理多线程,就要用lock了,

不过还是有些不明白,
1. 从发生错误,到执行Application_Error事件,具体过程是怎样的? 中间发生了什么,作为程序员有没有必要了解?
2. 实际运行时global.asax是会实例化吗?还是说是静态的,只有一个,与具体产生了多少请求无关?
3. 实际运行过程中Httpapplication对象不是会有多个吗?那global.asax继承的是哪一个?
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Momolt 2014-08-30
  • 打赏
  • 举报
回复
顶下
  • 打赏
  • 举报
回复
引用 1 楼 rtdb 的回复:
用户的请求是并发的,IIS是用多线程来处理的, 那么在global.asax中记录错误也是多线程并发的, 所以如果你的错误信息是记录到一个文件中的, 那么为了防止并发访问冲突,最好加锁。
各线程触发的异常也是相对独立的局部变量,除非在Application_Error中访问了共享资源 不过,像LS说的这种锁,应该封装到写日志的类中会好一些
moonwrite 2014-08-29
  • 打赏
  • 举报
回复
引用 4 楼 wyumening 的回复:
[quote=引用 3 楼 moonwrite 的回复:] 那么为什么在global.asax中记录错误时要用lock呢? 假设 记录是用txt的~ 那么一个线程在写错误的时候 另外一个线程也进来写 你觉得最后的结果呢~ 1. 从发生错误,到执行Application_Error事件,具体过程是怎样的? 中间发生了什么,作为程序员有没有必要了解? 既然是事件~那么就是按.net的约定~ 一般是有object sender发起的~ 而既然提供事件了~ 如果你对委托和事件的概念理解 应该可以猜到 可以了解 这个是asp.net 的框架~问题~ 可以看看源码。 2. 实际运行时global.asax是会实例化吗?还是说是静态的,只有一个,与具体产生了多少请求无关? 只有一个~应该是实例化的~ 第一个请求会初始化~ 3. 一个 之前看过类似的资料 是有图的~~ 找不到了~ 下面是没有图的 ~ 你可以看看相关的知识点 然后提取一下关键字 再去搜索看看~ http://www.360doc.com/content/11/0505/13/6075898_114533400.shtml http://hi.baidu.com/handsomevboy/item/8e246e1a2672eff0dceecaf6
感谢回答!提问是因为觉得asp.net本身是多线程的,所以有点不大理解为什么要用lock, 还想问下: 1: 听到有人说asp.net是多线程的,这是不是体现在iis本身是多线程,如果多个用户对同一个页面发起请求,asp.net框架本身会自动产生多个线程来处理多个请求,不用程序员手动写代码来实现线程安全? 2:有哪些典型情况下在asp.net的开发环境下也要考虑线程安全? 比如在global.asax中?使用application变量时?还有其他情况吗?[/quote] 1.asp.net对应每个请求都会有一个线程来处理。 asp.net框架本身会自动产生多个线程来处理多个请求,不用程序员手动写代码来实现线程安全? 就是因为多线程~所以才需要考虑线程安全。 2. 你从框架的情况下来考虑有那些情况需要线程安全不是怎么好的~ 换一个角度~ 什么样的东西~不可以同时被两个线程操作~ 以上面的日志来说 如果保存日志的是txt文件,那么需要线程安全! 因为如果线程甲需要写如的是ABC... 线程已需要些人的123 如果两个线程一起写 那么就有可能是A12BC3 不符合预期目标 如果保存日志的是数据库,那么不需要线程安全 分别发两个sql给数据库~ 让数据库自己去插入 从你的问题2看到了应试教育的影子
WM_JAWIN 2014-08-29
  • 打赏
  • 举报
回复
理论上来说,一个请求就对应一个线程,如果不是访问稀缺资源(如,对同一文件进行写操作,静态成员存取),是不用lock的 写日志要lock,估计是你的日志是直接写入文件的。上锁是为了防止 多个线程(用户)同时对这个文件进行写操作,这是不允许的。
wyumening 2014-08-29
  • 打赏
  • 举报
回复
引用 3 楼 moonwrite 的回复:
那么为什么在global.asax中记录错误时要用lock呢? 假设 记录是用txt的~ 那么一个线程在写错误的时候 另外一个线程也进来写 你觉得最后的结果呢~ 1. 从发生错误,到执行Application_Error事件,具体过程是怎样的? 中间发生了什么,作为程序员有没有必要了解? 既然是事件~那么就是按.net的约定~ 一般是有object sender发起的~ 而既然提供事件了~ 如果你对委托和事件的概念理解 应该可以猜到 可以了解 这个是asp.net 的框架~问题~ 可以看看源码。 2. 实际运行时global.asax是会实例化吗?还是说是静态的,只有一个,与具体产生了多少请求无关? 只有一个~应该是实例化的~ 第一个请求会初始化~ 3. 一个 之前看过类似的资料 是有图的~~ 找不到了~ 下面是没有图的 ~ 你可以看看相关的知识点 然后提取一下关键字 再去搜索看看~ http://www.360doc.com/content/11/0505/13/6075898_114533400.shtml http://hi.baidu.com/handsomevboy/item/8e246e1a2672eff0dceecaf6
感谢回答!提问是因为觉得asp.net本身是多线程的,所以有点不大理解为什么要用lock, 还想问下: 1: 听到有人说asp.net是多线程的,这是不是体现在iis本身是多线程,如果多个用户对同一个页面发起请求,asp.net框架本身会自动产生多个线程来处理多个请求,不用程序员手动写代码来实现线程安全? 2:有哪些典型情况下在asp.net的开发环境下也要考虑线程安全? 比如在global.asax中?使用application变量时?还有其他情况吗?
moonwrite 2014-08-29
  • 打赏
  • 举报
回复
那么为什么在global.asax中记录错误时要用lock呢? 假设 记录是用txt的~ 那么一个线程在写错误的时候 另外一个线程也进来写 你觉得最后的结果呢~ 1. 从发生错误,到执行Application_Error事件,具体过程是怎样的? 中间发生了什么,作为程序员有没有必要了解? 既然是事件~那么就是按.net的约定~ 一般是有object sender发起的~ 而既然提供事件了~ 如果你对委托和事件的概念理解 应该可以猜到 可以了解 这个是asp.net 的框架~问题~ 可以看看源码。 2. 实际运行时global.asax是会实例化吗?还是说是静态的,只有一个,与具体产生了多少请求无关? 只有一个~应该是实例化的~ 第一个请求会初始化~ 3. 一个 之前看过类似的资料 是有图的~~ 找不到了~ 下面是没有图的 ~ 你可以看看相关的知识点 然后提取一下关键字 再去搜索看看~ http://www.360doc.com/content/11/0505/13/6075898_114533400.shtml http://hi.baidu.com/handsomevboy/item/8e246e1a2672eff0dceecaf6
rayyu1989 2014-08-29
  • 打赏
  • 举报
回复
看你错误日志是推送到哪里去 如果是sql 就不用lock 如果是文件 孜然需要独占
rtdb 2014-08-29
  • 打赏
  • 举报
回复
用户的请求是并发的,IIS是用多线程来处理的, 那么在global.asax中记录错误也是多线程并发的, 所以如果你的错误信息是记录到一个文件中的, 那么为了防止并发访问冲突,最好加锁。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧