乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 90|回复: 7

锁定文档

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-7-24 13:20:57 | 显示全部楼层 |阅读模式
因此,我只是遇到了需要锁定文档才能打开数据库进行写入的问题。这对某些人来说可能是显而易见的,但Id喜欢得到一些关于我对这个问题的理解的确认或纠正。我得到了从[CommandMethod]调用的函数,并且运行良好。如果我从调色板上的按钮调用相同的函数,我会收到一个eLockViolation。为了让这段代码运行,我需要调用LockDocument()函数,这是我通过Autodesk .NET教程Lab6中的interwebs找到的。我的猜测是,每次调用命令时CAD都会锁定文档,这就是为什么如果我的函数被命令调用,我根本不需要调用它。这是正确的吗?如果是这样,我只需要在从非命令(如按钮单击)或属性网格中的更新字段调用数据库写入时锁定文档。我目前的方法是在按钮单击事件中锁定文档,如图所示。这对我来说似乎是一个不好的做法,但我不确定我是否需要在代码中更深入地嵌入它。界面事件是否是锁定文档的好地方?完成时,是否有某种文档解锁/释放我应该调用?private void btnValveInsert_Click(object sender, EventArgs e)。
{。
Active.Document.LockDocument(DocumentLockMode.ProtectedAutoWrite, null, null, true);。
阀门工厂.插入动态阀门(30);。
}。

// VS。

[命令方法(“IR_InsValve”)]。
public void InsertValve()。
{。
阀门工厂.插入动态阀门(30);。
}。
在稍微不同的一点上,在从本教程中查看LAB6时,我注意到以下注释://无论发生什么,我们都必须处理事务。(这是在“最后”块中),每当我使用一个事务时,当我完成它并且没有调用dis dispose()时,我都会提交()它,并且事情一直运行良好。处置交易的目的是什么?。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-7-24 13:32:03 | 显示全部楼层
这是一个使用System将事务和文档锁定联系在一起的小类;。
使用Autodesk.AutoCAD.DatabaseServices;。
使用Autodesk.AutoCAD.ApplicationServices;。

命名空间Autodesk.AutoCAD.Runtime。
{。
公共类LockedTransaction:Transaction。
{。
DocumentLock docLock;。
public LockedTransaction(Transaction trx, DocumentLock docLock)。
:基地(trx.UnmanagedObject,trx.AutoDelete)。
{。
Interop.DetachUnmanagedObject(trx);。
GC.SuppressFinalize(trx);。
this.docLock=docLock;。

}。

保护覆盖无效处置(boolA_1)。
{。

base.Dispose(A_1);。
如果(A_1)。
{。
docLock.Dispose();。
}。
}。
}。


}。
通过扩展方法调用它使用Autodesk.AutoCAD.ApplicationServices.Core;。
使用Autodesk.AutoCAD.Runtime;。

命名空间Autodesk.AutoCAD.ApplicationServices。
{。
公共静态类TransactionManager扩展。
{。
公共静态LockedTransaction StarLockedTransaction(此TransactionManager tm)。
{。
DocumentLock doclock=Application.DocumentManager.MdiActiveDocument.LockDocument();。
返回新的LockedTransaction(tm.StartTransaction(), doclock);。
}。

公共静态LockedTransaction StarLockedTransaction(this TransactionManager tm, DocumentLockMode lockMode, string globalCommand dName, string localCommand dName, bool提示Ifails)。
{。
DocumentLock doclock=Application.DocumentManager.MdiActiveDocument.LockDocument(lockMode, globalCommand dName, localCommand dName,一次失败);。
返回新的LockedTransaction(tm.StartTransaction(), doclock);。
}。
}。
}。



回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
331
发表于 2015-7-24 13:49:45 | 显示全部楼层
谢谢Jeff。我总是对扩展方法印象深刻,我正在使用一些Giles,它们似乎是我遇到的一些样板代码的优雅解决方案。
如果我正确阅读了这一点,那么在我打开数据库进行编写时实例化LockedTransaction是有意义的?
我期待着今天下午晚些时候尝试这段代码。再次感谢。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-7-24 14:07:16 | 显示全部楼层
我不太清楚为什么您需要一个文档锁,但是从调色板运行代码需要一个锁。可能是因为调色板和当前文档之间没有联系,因为调色板在应用程序中浮动,而不是在文档中。
还有其他需要文档锁定的操作,例如,如果您在布局之间切换,如果您不锁定文档,实际上什么也不会发生。
总是使用锁没有坏处。所以你可以在你写的每个函数中使用锁。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2015-7-24 14:38:37 | 显示全部楼层

感谢您的回复huiz。您是说为每个事务锁定文档不会对性能产生很大影响吗?如果是这样,那正是我要做的。尽管我不得不怀疑如果是这样的话,为什么它没有内置到事务管理器中。
@Jeff,感谢您分享您的扩展类。看起来除非它是只读的,否则我将使用锁定的事务。
为了公开回答我自己的问题,我注意到disuse()覆盖是在事务脱离范围后调用的,大概是在垃圾回收机制期间。这意味着我没有理由调用它。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-7-24 15:46:54 | 显示全部楼层
据我所知,问题在于调用方法的上下文。
CommandMethod将应用程序置于特定的上下文中,而Button或MenuItem Click事件不会(固有地)将应用程序置于特定的上下文中,因此,您提供了对“using”lock document()的调用,问题得到了缓解。
我使用了许多ContextMenuExtensions(阅读MenuItem。点击),在我的事务中从未发现性能上的显著差异,但这并不是说它本身没有任何影响。干杯
回复

使用道具 举报

12

主题

64

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2015-7-24 15:49:51 | 显示全部楼层
嗨,
欧特克对此提供了一些留档。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2015-7-27 10:54:22 | 显示全部楼层
关键在于应用程序是模态的还是非模态的
如果是非模态的,则需要在对文档进行任何更改之前锁定文档。由于您的应用程序可能会更改任何打开的文档,因此必须进行锁定
如果是模态,则表示文档锁定。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 00:46 , Processed in 0.155235 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表