关闭通过事务获取的 AutoCAD 对象



我正在编写一个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上

最新更新