gpt4 book ai didi

c# - 我应该将 IDisposable 用于纯托管资源吗?

转载 作者:行者123 更新时间:2023-11-30 22:46:34 25 4
gpt4 key购买 nike

场景如下:

我有一个名为 Transaction 的对象,它需要确保在任何给定时间只有一个实体有权编辑它。

为了促进长期锁定,我让类生成可用于进行编辑的 token 对象。

你会像这样使用它:

var transaction = new Transaction();

using (var tlock = transaction.Lock())
{
transaction.Update(data, tlock);
}

现在,我想让TransactionLock 类实现IDisposable,这样它的用法就很清楚了。但是,我没有任何非托管资源可供处置。然而,TransctionLock 对象本身是一种“非托管资源”,因为 CLR 不知道如何正确地完成它。

所有这些都很好,花花公子,我会使用 IDisposable 并完成它。

但是,当我尝试在终结器中执行此操作时,我的问题就来了:

~TransactionLock()
{
this.Dispose(false);
}

如果可能的话,我希望终结器从锁中释放事务。 在终结器中,如何检测父事务 (this.transaction) 是否已经完成?

我应该使用更好的模式吗?

此外,Transaction 类本身不需要是一次性的,因为它不维护对锁的引用,并且不关心它在访问时是否解锁坟墓。


交易类看起来像这样:

public sealed class Transaction
{
private readonly object lockMutex = new object();

private TransactionLock currentLock;

public TransactionLock Lock()
{
lock (this.lockMutex)
{
if (this.currentLock != null)
throw new InvalidOperationException(/* ... */);

this.currentLock = new TransactionLock(this);
return this.currentLock;
}
}

public void Update(object data, TransactionLock tlock)
{
lock (this.lockMutex)
{
this.ValidateLock(tlock);

// ...
}
}

internal void ValidateLock(TransactionLock tlock)
{
if (this.currentLock == null)
throw new InvalidOperationException(/* ... */);

if (this.currentLock != tlock)
throw new InvalidOperationException(/* ... */);
}

internal void Unlock(TransactionLock tlock)
{
lock (this.lockMutex)
{
this.ValidateLock(tlock);

this.currentLock = null;
}
}
}

以及 TransactionLockDispose(bool) 代码:

private void Dispose(bool disposing)
{
if (disposing)
{
if (this.Transaction != null)
{
this.Transaction.Unlock(this);
this.Transaction = null;
}
}
}

最佳答案

这是 discussed before .不过,您的情况要容易得多,您还在实现终结器。这是根本错误的,您在客户端代码中隐藏了一个错误。请注意终结器在单独的线程上运行。调试一致的死锁比处理随机和异步消失的锁要容易得多。

建议:跟随 .NET 框架的领导:不要提供太多帮助。微软出于同样的原因放弃了 Synchronized 方法。

关于c# - 我应该将 IDisposable 用于纯托管资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580876/

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