首页 > 解决方案 > c#如何等待外部代码完成

问题描述

我的应用程序使用各种 .dll 与另一个软件 (Catia V6/3DEXPERIENCE) 对话。

此界面中的某些功能似乎稍微异步运行,这导致我的脚本偶尔出现故障。

“AnyObject”和“Selection”类型,连同它们的功能,来自.dll;“IsolateThis”函数嵌入在我自己的类中。

    public INFITF.AnyObject IsolateThis(INFITF.AnyObject thing)
    {
        Selection osel = catapp.ActiveEditor.Selection; //get a selection object
        osel.Clear(); //make sure nothing pre-selected
        osel.Add(thing); //add item to be copied to selection
        osel.Copy(); //copy
        osel.Clear(); //clear selection
        osel.Add(this.hbod); //add item to paste into
        osel.Paste(); //paste
        this.part.Update(); //update the parent object
        return (INFITF.AnyObject)osel.Item(1).Value; //return pasted result

    }

该函数基本上复制一个对象,将其粘贴到另一个对象中,然后返回结果粘贴的对象。Selection 对象可以在您粘贴后自行更新以仅包含粘贴的内容,这就是最后一行有效的原因。

出于某种原因,当我单步执行代码时它很好,但是如果我尝试在其他地方实时使用返回的对象,那么我有时会得到一个无效的强制转换异常,例如在以下行:

CATCurve tmpcurve = new CATCurve((HybridShapeCurveExplicit)tmpbody.IsolateThis(this.Branch.shape));

当我按 F10 继续时,这不会再次发生。我的怀疑是它正在向 Catia 发送粘贴命令,这需要时间才能完成,但正在继续使用我的其余代码而不需要响应。这会导致返回错误的对象(因为“this.hbod”仍被视为所选对象,与预期的返回对象不兼容)。

如何包装/重构它以确保粘贴和更新操作已完全完成?从外部参考中提取的东西甚至可能吗?

我对 c# 还是很陌生。我已经尝试过使用任务和流程,但老实说,在这种情况下如何实现它们我很迷茫。

标签: c#visual-studio-2010catia

解决方案


推荐阅读