【问题标题】:Closing AutoCAD objects which were obtained via transaction关闭通过事务获得的 AutoCAD 对象
【发布时间】:2016-07-06 10:10:52
【问题描述】:

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

文档中写到,当调用 Commit() 方法时,事务会关闭通过事务接收到的每个对象。

void Commit() -- 该函数提交在 Transaction 期间打开的所有 DBObjects 中所做的更改,然后关闭它们。

但是当我不调用这个方法时会发生什么?例如,我只使用事务来打开一个对象并接收其层名称。类似于以下内容:

    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;
        }
    }

鼓励链接到官方来源。

谢谢。

【问题讨论】:

  • 通常您不需要处置每个实体。在第二种情况下,如果 'entity' 为 'null',则在调用 'entity.Dispose' 时会得到 'Exception'。
  • @SarveshMishra 不,我不会。我已经运行了该代码,即使实体为空 - 我也不会遇到任何异常。

标签: c# .net autocad


【解决方案1】:

我记得读过 Kean Walmsley 的一篇文章,他提到如果您不使用 Commit(),事务将始终默认使用 Abort()(我会查一下)。

如果在事务中使用实体,它们将被自动处置。 Kean 在他的博客上有一些很好的例子。您绝对应该检查一下。 你可以找到他们here

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

编辑:

忘记提交事务

[...] 一个未提交的事务在被处置时被中止,所以 您在事务中对数据库所做的每项更改都会滚动 返回 [...]

Stephen Preston here 发布在 adndevblog 上

【讨论】:

  • 感谢您的回答。据我了解,我不需要处理由事务打开的对象,因为它们将由事务处理。我说的对吗?
  • 是的。通过处理您的交易,它会处理您在其中的实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2015-01-07
  • 1970-01-01
相关资源
最近更新 更多