首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDisposable和ReaderWriterLockSlim

IDisposable和ReaderWriterLockSlim
EN

Stack Overflow用户
提问于 2013-02-03 18:36:10
回答 1查看 1.5K关注 0票数 2

我有一个MyClass类。这个类有一个字段:public ReaderWriterLockSlim rw; (对于更简单的示例代码,它是公共的)。许多线程可以使用rw.EnterReadLock等从MyClass读取数据。

我还实现了IDisposable接口:

代码语言:javascript
复制
private void Dispose (bool pDisposing)
{
    {
        if (pDisposing) // release managed resources
        {
            if (rw != null)
            {
                rwLockSlim.Dispose ();
                rwLockSlim = null;
            }
        }

        //--- release unmanaged resources
        // some code...
        isDisposed = true; // ...
    }
}

如你所见,当第二个线程在myClass对象上调用Dispose时,当一个线程正在使用MyClass时,问题是。我不能处理ReaderWriterLockSlim,因为它会使我的应用程序崩溃。那么我应该只删除释放托管资源行吗?无论如何,ReaderWriterLockSlim将在不久的将来由GC收集,对吗?(但是这个类的资源是否很昂贵?)

也许我应该在Dispose方法中添加一些锁(SyncObject)或者别的什么?

编辑:我还处理AllocHGlobal,所以我需要等待,直到所有线程停止对myClass的读/写。

不同的观点:

代码语言:javascript
复制
public MyClass : IDisposable
{
            public void EnterReadLock (); // calls rwLockSlim.EnterReadLock,  
                                          // if object is disposed throws Exception

            public void ExitReadLock ();  // same as above

            public void Dispose ();       // wait until all threads exit from locks,
                                          // frees unamanged resources, mark class as disposed
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-03 19:09:40

这可能不是最好的答案,而是观察和一些想法。

你能简化你的代码吗?我的意思是,其他类型不应该关心你的类型在特定的并发条件下是否抛出异常。您将如何测试此功能?公共锁对象是邪恶的。它必须是私有的,除非你想花几个月的时间来找出神秘的bug。

如果调用dispose方法,则意味着任何其他对象都不应使用此对象。这意味着在调用dispose方法之前,必须首先确保所有线程都完成了对对象的操作。

建议

静态锁使锁私有并确保所有线程都已完成,在调用dispose之前使用静态锁object

  • ReaderWriterLockSlim为安全的behaviour

  • Consider添加超时并不消耗资源(这一点你应该关心在你的application)

  • If中你的类使用了可处置的资源,通常更好的方法是实现需要被disposed.

  • Don't的
  • 在Dispose方法中添加任何锁,它应该很简单。这可能会引入令人不快的bug。因为如果您忘记手动调用Dispose,它将被GC不确定地调用(通过finiliser,您也应该添加该finiliser来调用Dispose)
  • Correct方法将等待直到所有线程完成并释放object
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14671564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档