遇到一个口头机遇的答辩准备2(ai告诉的要点)
代码处理的过程其实已经不是当时的过程了。算是事后的整理过程吧先来问下CAD二开要点ai给出了以下十一点一、核心原则一些操作必须包 Transaction事务音标/trænˈzækʃn/增删改图形必须用事务读用ForRead改写用ForWrite用完自动释放using(Transaction tr ……看到这里感觉using(Transaction tr ……很眼熟之前写的也用了很多大概当时也是知道是事务因为注释有写。using(……){……}这部分是C#的与CAD没有关系作用是自动释放资源防止内存泄漏Transaction这部分是CAD的 APIAutoCAD数据库事务例如ldb.TransactionManager.StartTransaction()来自Autodesk.AutoCAD.DatabaseServices,作用是给CAD图纸开一个事务但是好奇既然他这里给出的Transaction tr ……说明赋值符号后面可能有变于是又问了一嘴他其实是cad的事务类型哦cad能创建事务的方法有3个db.TransactionManager.StartTransaction()普通新事务比如画图、改图、删图、读图99%第时间都用这个最安全db.TransactionManager.StartTransaction(TransactionFlags.None / NoFlush / NoNotification / NoLocking)带参数的普通事务。TransactionFlags.None默认正常事务。TransactionFlags.NoFlush不立即刷新数据库批量优化减少频繁刷新1W条以上。TransactionFlags.NoNotification不触发对象事件ObjectAppended…不触发任何通知。TransactionFlags.NoLocking不加锁极危险只读极端优化。db.TransactionManager.StartTopTransaction() 嵌套事务,创建顶层事务不管嵌套多少层她永远是最外层只有顶层事务Commit()才真正写入数据库嵌套事务内部用db.TransactionManager.StartOpenClosedTransaction()重新打开已经关闭Abort/Commit的事务极底层、极特殊永远不会在业务代码里用用于CAD内部撤销/重做机制这时候就开始好奇那前面的是固定的么问了下ai是固定的。第一个db很好猜是数据库第二个TransactionManager事务管理器他管理事务的创建、嵌套、关闭。嵌套事务工作从上到下StartTopTransaction最外层TransactionTransactionActiveTransaction当前只有TopTransaction.Commit()才真正写入数据库内层Commit只是“标记完成”当前层ok不是真正提交任意一层Abort()都是全部作废整个事务树全部回滚所有修改全部作废不是仅当前层回滚。TransactionManager除了这几个新建事务以外还有3个核心的获取已有事务分别是db.TransactionManager.TopTransaction获取当前已存在的顶层事务db.TransactionManager.AllClosedTransactions返回一堆已关闭的旧事务列表db.TransactionManager.ActiveTransaction获取别人的事务所以结论是New出来的才能usingGet出来的绝对不能using不能跨事务持有对象OnjectId可存Entity/Polyline不能长期持有必须再正确上下文命令里跑[CommandMethod]不能在多线程直接操作CAD数据库异常必须捕获避免CAD崩溃、卡死二、最常用命名空间using Autodesk.AutoCAD.ApplicationServices; // 文档、应用 using Autodesk.AutoCAD.DatabaseServices; // 图元、事务、图层 using Autodesk.AutoCAD.EditorInput; // 选择、输入、命令行 using Autodesk.AutoCAD.Geometry; // 点、坐标、矩阵 using Autodesk.AutoCAD.Runtime; // 命令注册、异常三、标准模板[CommandMethod(MyCmd)] public void MyCommand() { Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; using (Transaction tr db.TransactionManager.StartTransaction()) { // 1. 获取模型空间 BlockTableRecord ms tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; // 2. 画图/改图 // ... tr.Commit(); // 提交才生效 } }灰色划掉部分是核对官网发现没有的去核对官网是因为发现ai说的有前后冲突提出之后说是混淆了C的api……
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479439.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!