我通常听说在调用事件侦听器之前解锁所有锁以避免死锁是一个好主意。然而,自从lock {}
块可以由 C# 中的同一线程重入,是否可以从锁定块调用事件,或者我是否需要复制相关状态数据并在锁定块外部调用事件?
如果没有,请举例说明何时从某个对象内调用事件会出现问题。lock {}
block.
Thanks
我不记得曾经需要从内部引发事件lock
陈述。但不难想象事情会变得糟糕。
当您引发事件时,您会将执行推迟到可能不属于您自己的代码。例如,如果您正在编写一些将被其他人使用的库或框架,则尤其如此。在事件处理程序内部,您完全无法控制发生的情况。事件处理程序可以启动一个全新的线程并等待该线程完成(即,Join()
)返回之前。如果该新线程调用了某个与您的线程锁定相同变量的函数lock
, 答对了。僵局。
但除此之外,最佳做法是尽量减少在室内花费的时间。lock
以减少锁定的“阻塞点”。如果您在lock
,所有的赌注都落空了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)