1. 程式人生 > >Revit二次開發高階應用(二)——怎樣在Revit中使用多執行緒

Revit二次開發高階應用(二)——怎樣在Revit中使用多執行緒

在Revit中完全可以使用多執行緒,只是需要滿足一定的規則:不改變Revit的Document文件的工作都可以線上程中完成,改變Document文件的工作都需要在主執行緒中完成。

如下:不改變文件,只是在執行緒裡建立輔助的線,執行之後,絲毫不錯。

namespace RevitUseThread
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    public class Commad : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Thread thread=new Thread(() =>{
                for(var i=0;i<10;i++)
                {
                    Line line = Line.CreateUnbound(new XYZ(0,10* i, 0), new XYZ(10, 10*i, 0));
                }
                
            });
            thread.Start();
            return Result.Succeeded;
        }
    }
}

然後試一下線上程中建立模型線,模型線是元素,會改變Revit文件,如果這部分線上程裡進行的話,會直接導致致命錯誤。

namespace RevitUseThread
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    public class Commad : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document revitDoc = commandData.Application.ActiveUIDocument.Document;
            Thread thread=new Thread(() =>{
                using (Transaction transaction = new Transaction(revitDoc, "建立模型線"))
                {
                    transaction.Start();
                    SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ,XYZ.Zero));
                    for (var i = 0; i < 10; i++)
                    {
                        Line line = Line.CreateUnbound(new XYZ(0, 10*i, 0), new XYZ(10, 10 * i, 0));
                        ModelCurve modelCurve = revitDoc.Create.NewModelCurve(line,sketchPlane);
                    }
                    transaction.Commit();
                }
            });
            thread.Start();
            return Result.Succeeded;
        }
    }
}

然後再在上面的基礎上稍加修改,把修改文件的部分移出到執行緒以外就可以正常運行了。

namespace RevitUseThread
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    public class Commad : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document revitDoc = commandData.Application.ActiveUIDocument.Document;
            CurveArray curveArray = new CurveArray();
            Thread thread=new Thread(() =>{
                for (var i = 0; i < 10; i++)
                {
                    Line line = Line.CreateBound(new XYZ(0, 10*i, 0), new XYZ(10, 10 * i, 0));
                    curveArray.Append(line);
                }
            });
            thread.Start();
            thread.Join();
            using (Transaction transaction = new Transaction(revitDoc, "建立模型線"))
            {
                transaction.Start();
                SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(new XYZ(0,0,1), XYZ.Zero));
                revitDoc.Create.NewModelCurveArray(curveArray, sketchPlane);
                transaction.Commit();
            }
            return Result.Succeeded;
        }
    }
}