![]() |
1
101
我注意到没有人在回答这个老问题时提到 是的,C#中的lock语句具有“finally”语义;当控件正常或异常退出锁时,锁被释放。你们都说这是件好事,但这是件坏事!如果您有一个引发未处理异常的锁定区域,正确的做法是 在销毁更多用户数据之前立即终止患病进程 打开锁,继续前进 . 这样看:假设你有一个浴室,门上有锁,外面有一排人在等着。浴室里的炸弹爆炸,炸死了里面的人。你的问题是“在这种情况下,锁是否会自动解锁,以便下一个人可以进入浴室?”是的,会。 一枚炸弹在那里爆炸,炸死了人!水管可能被破坏了,房子的结构不再完好,而且 那里可能还有另一颗炸弹 . 正确的做法是 我的意思是,仔细考虑一下:如果您锁定了一个代码区域,以便从数据结构中读取而不在另一个线程上进行变异,并且该数据结构中的某个内容引发了异常, . 用户数据现在乱七八糟;你不会想的 尝试保存用户数据 此时,因为您正在保存 贪污的 数据终止这个过程。 如果数据以前没有损坏,现在肯定是 防范 . 现在,等待读取该状态的代码将 无论如何分割,锁中的异常都是 坏消息 . 正确的问题不是“如果发生异常,我的锁会被清除吗?”正确的问题是“我如何确保锁内永远不会有异常?如果有,那么我如何构造我的程序,以便将突变回滚到以前的良好状态?” |
![]() |
2
91
锁将被释放,原因有2个;第一
第二您捕获并不重新抛出内部异常,因此
因此,除了最致命的灾难性不可恢复的异常外,它将在所有情况下发布。 |
![]() |
3
43
|
![]() |
4
14
lock语句被编译为对Monitor.Enter的调用,然后是tryfinally块。在finally块中,调用Monitor.Exit。 x86和x64的JIT代码生成可确保线程中止不会在监视器之间发生。Enter调用和紧随其后的try块之间发生。” 摘自: This site |
![]() |
5
6
只是对Marc出色的回答补充一点。
像这样的情况正是这种现象存在的原因
如果你被迫使用
|
![]() |
6
6
您的锁将被正确释放。A.
和
|
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
![]() |
Aave · 错误数组长度的特定异常 6 年前 |