1. 原理
autocad本身不支持多线程,需使用SynchronizationContext将工作线程托管到autocad主线程执行
参考:https://www.codeproject.com/Articles/31971/Understanding-SynchronizationContext-Part-I
2. 代码
[CommandMethod("DrawLine")]
public void DrawLineInThread()
{
var currentContext = Autodesk.AutoCAD.Runtime.SynchronizationContext.Current;
if (currentContext == null)
{
currentContext = new Autodesk.AutoCAD.Runtime.SynchronizationContext();
}
var task = Task.Factory.StartNew(() =>
{
currentContext.Post(DrawLine, null);
});
}
private void DrawLine(object state)
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.CurrentDocument;
var db = HostApplicationServices.WorkingDatabase;
using (var lockDoc = doc.LockDocument()) // 需 lock document 否则会出现{eLockViolation} 导致文件崩溃
{
using (var trans = db.TransactionManager.StartTransaction())
{
var block = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
var blkTbl = trans.GetObject(block[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
Line line = new Line();
line.StartPoint = new Autodesk.AutoCAD.Geometry.Point3d(0, 0, 0);
line.EndPoint = new Autodesk.AutoCAD.Geometry.Point3d(10000, 1, 0);
blkTbl.AppendEntity(line);
trans.AddNewlyCreatedDBObject(line, true);
// handle = line.Handle.ToString();
trans.Commit();
}
}
}