锁定文档
因此,我只是遇到了需要锁定文档才能打开数据库进行写入的问题。这对某些人来说可能是显而易见的,但Id喜欢得到一些关于我对这个问题的理解的确认或纠正。我得到了从调用的函数,并且运行良好。如果我从调色板上的按钮调用相同的函数,我会收到一个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()时,我都会提交()它,并且事情一直运行良好。处置交易的目的是什么?。
**** Hidden Message ***** 这是一个使用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);。
}。
}。
}。
。
。
。
谢谢Jeff。我总是对扩展方法印象深刻,我正在使用一些Giles,它们似乎是我遇到的一些样板代码的优雅解决方案。
如果我正确阅读了这一点,那么在我打开数据库进行编写时实例化LockedTransaction是有意义的?
我期待着今天下午晚些时候尝试这段代码。再次感谢。 我不太清楚为什么您需要一个文档锁,但是从调色板运行代码需要一个锁。可能是因为调色板和当前文档之间没有联系,因为调色板在应用程序中浮动,而不是在文档中。
还有其他需要文档锁定的操作,例如,如果您在布局之间切换,如果您不锁定文档,实际上什么也不会发生。
总是使用锁没有坏处。所以你可以在你写的每个函数中使用锁。
感谢您的回复huiz。您是说为每个事务锁定文档不会对性能产生很大影响吗?如果是这样,那正是我要做的。尽管我不得不怀疑如果是这样的话,为什么它没有内置到事务管理器中。
@Jeff,感谢您分享您的扩展类。看起来除非它是只读的,否则我将使用锁定的事务。
为了公开回答我自己的问题,我注意到disuse()覆盖是在事务脱离范围后调用的,大概是在垃圾回收机制期间。这意味着我没有理由调用它。 据我所知,问题在于调用方法的上下文。
CommandMethod将应用程序置于特定的上下文中,而Button或MenuItem Click事件不会(固有地)将应用程序置于特定的上下文中,因此,您提供了对“using”lock document()的调用,问题得到了缓解。
我使用了许多ContextMenuExtensions(阅读MenuItem。点击),在我的事务中从未发现性能上的显著差异,但这并不是说它本身没有任何影响。干杯 嗨,
欧特克对此提供了一些留档。 关键在于应用程序是模态的还是非模态的
如果是非模态的,则需要在对文档进行任何更改之前锁定文档。由于您的应用程序可能会更改任何打开的文档,因此必须进行锁定
如果是模态,则表示文档锁定。
页:
[1]