关闭通过事务获取的 AutoCAD 对象
本文关键字:AutoCAD 对象 获取 事务 | 更新日期: 2023-09-27 17:55:26
我正在编写一个AutoCAD插件。我正在使用事务来获取一些对象,我想出了一个问题 - 我是否需要关闭(处置)通过事务收到的对象?
文档中写着,当 Commit() 方法被调用时,事务会关闭通过事务接收的每个对象。
void Commit() -- 此函数提交在事务期间打开的所有 DBObject 中所做的更改,然后关闭它们。
但是当我不调用此方法时会发生什么?例如,我仅使用事务来打开对象并接收其层名称。如下所示:
Database hostapp_workdb = HostApplicationServices.WorkingDatabase;
using ( Application.DocumentManager.MdiActiveDocument.LockDocument() )
using ( Transaction transaction = hostapp_workdb.TransactionManager.StartTransaction() )
{
Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity;
if ( entity != null )
layer = entity.Layer;
}
如您所见,这里我不调用 Commit()。在这种情况下会发生什么?实体是否会关闭(因为事务正在使用它必须被处置,所以我想它必须关闭所有对象。但我在文档中没有找到任何确认,所以这只是我的假设)。
也许我需要这样做:
ObjectId objectId = new ObjectId();
string layer = string.Empty;
Database hostapp_workdb = HostApplicationServices.WorkingDatabase;
using ( Application.DocumentManager.MdiActiveDocument.LockDocument() )
using ( Transaction transaction = hostapp_workdb.TransactionManager.StartTransaction() )
{
using ( Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity )
{
if ( entity != null )
layer = entity.Layer;
}
}
鼓励链接到官方来源。
谢谢。
我记得读过Kean Walmsley的一篇文章,他提到如果你不使用Commit(),一个事务将始终默认使用Abort()(我会查找它)。
如果在事务中使用实体,则会自动释放实体。基恩在他的博客上有一些很好的例子。你绝对应该检查一下。你可以在这里找到它们
如果必须释放实体,您还会在编译器输出中收到通知。
编辑:
忘记提交事务
[...]未提交的事务在释放时会中止,因此 在事务中对数据库所做的每个更改都会滚动 返回 [...]
它由Stephen Preston发布在adndevblog上