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

时间:2016-07-06 10:10:53

标签: c# .net autocad

我正在编写AutoCAD插件。我使用事务来获取一些对象,我想出了一个问题 - 我是否需要关闭(Dispose)通过事务收到的对象?

在文档中写道,当调用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;
        }
    }

鼓励官方消息来源链接。

谢谢。

1 个答案:

答案 0 :(得分:2)

我记得读过Kean Walmsley的一篇文章,他提到如果你不使用Commit(),那么每个默认情况下交易总是会使用Abort()(我会查一查)。

如果在交易中使用实体,将自动处置。 基恩在他的博客上有一些很好的例子。你一定要看看它们。 你可以找到它们here

如果必须处理实体,您还会在编译器输出中收到通知。

编辑:

  

忘记提交交易

     

[...]未处理的事务在处理时被中止,所以   您对事务中对数据库所做的每个更改都将进行滚动   回[...]

由Stephen Preston here

发布在adndevblog上