gpt4 book ai didi

c# - IDisposable 和 ReaderWriterLockSlim

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:50 27 4
gpt4 key购买 nike

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

我还实现了IDisposable接口(interface):

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 方法中添加一些 lock(syncObject) 之类的东西?

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

不同的观点:

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
}

最佳答案

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

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

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

建议

  • 将锁设为私有(private)
  • 在调用 dispose 之前确保所有线程都已完成
  • 为安全行为添加超时
  • 考虑使用静态锁对象
  • ReaderWriterLockSlim 并不占用大量资源(在您的应用程序中您应该关心这一点)
  • 如果您的类使用一次性资源,通常最好实现 IDisposable 并处置需要处置的成员。
  • 不要在 Dispose 方法中添加任何锁,它应该很简单。这可能会引入不愉快的错误。因为如果您忘记手动调用 Dispose,GC 将不确定地调用它(通过一个 finiliser,您也应该添加它来调用 Dispose)
  • 正确的方法是等到所有线程都完成并释放一个对象

关于c# - IDisposable 和 ReaderWriterLockSlim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671564/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com