c# – 微软对ReaderWriterLockSlim.IsReadLockHeld / IsWriteLoc
要同步对我的属性的访问,我使用
ReaderWriterLockSlim类.我使用以下代码以线程安全的方式访问我的属性.
public class SomeClass { public readonly ReaderWriterLockSlim SyncObj = new ReaderWriterLockSlim(); public string AProperty { get { if (SyncObj.IsReadLockHeld) return ComplexGetterMethod(); SyncObj.EnterReadLock(); try { return ComplexGetterMethod(); } finally { SyncObj.ExitReadLock(); } } set { if (SyncObj.IsWriteLockHeld) ComplexSetterMethod(value); else { SyncObj.EnterWriteLock(); ComplexSetterMethod(value); SyncObj.ExitWriteLock(); } } } // more properties here ... private string ComplexGetterMethod() { // This method is not thread-safe and reads // multiple values,calculates stuff,ect. } private void ComplexSetterMethod(string newValue) { // This method is not thread-safe and reads // and writes multiple values. } } // ===================================== public static SomeClass AClass = new SomeClass(); public void SomeMultiThreadFunction() { ... // access with locking from within the setter AClass.AProperty = "new value"; ... // locking from outside of the class to increase performance AClass.SyncObj.EnterWriteLock(); AClass.AProperty = "new value 2"; AClass.AnotherProperty = "..."; ... AClass.SyncObj.ExitWriteLock(); ... } 每当我收到或设置多个属性时,为了避免不必要的锁定,一旦我发布了ReaderWriterLockSlim-Object,并且每当我要获取或设置一堆属性时,它会从类外部锁定.为了达到这个目的,我的getter和setter方法检查是否已经使用IsReadLockHeld属性和ReaderWriterLockSlim的IsWriteLockHeld属性来获取锁.这工作正常,并增加了我的代码的性能. 到目前为止这么好,但是当我重新阅读有关IsReadLockHeld和IsWriteLockHeld的文档时,我注意到Microsoft的备注:
我的问题是:为什么我不应该使用IsReadLockHeld / IsWriteLockHeld为此目的?我的代码有什么问题吗?一切都按预期方式工作,比使用递归锁(LockRecursionPolicy.SupportsRecursion)快得多. 澄清一下:这是一个最小的例子.我不想知道锁本身是否必要或可以以不同的方式被删除或实现.我只是想知道为什么我不应该使用IsReadLockHeld / IsWriteLockHeld来控制程序的流程,如文档所述. 解决方法
经过进一步研究,我在
German Support Forum of the Microsoft Developer Network发表了同样的问题,并与非常有帮助的主持人马塞尔·罗姆(Marcel Roma)进行了讨论.他能够联系写作这个答案的ReaderWriterLockSlim Joe Duffy的程序员:
总结一下:您可以使用IsReadLockHeld和IsWriteLockHeld属性来有条件地获取锁定,一切都可以正常工作,但是编程风格不好,应避免使用.最好坚持递归或非递归锁.为了保持良好的编码风格,IsReadLockHeld和IsWriteLockHeld只能用于调试目的. 我要再次感谢马塞尔·罗马和乔·达菲的宝贵帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 在delayed_job进程作业之后回调
- c – 为什么必须将SetWindowsHookEx与Windows消息队列一起使
- ruby-on-rails – Ruby on Rails中的一次更改模型属性(列名
- c# – UnityWebRequest.downloadHandler返回null,同时从Nod
- Postgresql中的extension
- 如何制作类似于Visual C#2008属性窗口的东西?
- Vue集成Iframe页面的方法示例
- cocos2dx 3.12 lua切换场景
- flash和js交互
- ruby-on-rails – 从Rake任务调用Application Controller功