c# - 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# 还是很陌生。我已经尝试过使用任务和流程,但老实说,在这种情况下如何实现它们我很迷茫。
解决方案
推荐阅读
- r - 如何编写一个从时间序列数据框中收集特定观察列表的函数
- python - 是否可以使用不确定的迭代器进行列表理解?
- visual-studio - 我在哪里将文件放在 nuget 包中以便恢复它们?
- android - Androidx BottomNavigationView 不会相应地播放过渡动画
- java - 如果一个数字在列表中出现多次,如何生成错误
- docker - traefik - 同一主机的多个端口绑定 V2
- python - 如何将多个 NumPy 数组从函数返回到单独的 Dataframe 列中
- angular - 当setValue存储在单选按钮中时如何防止循环?
- swift - Swift 4 到 Swift 5 Xcode 错误
- laravel - 使用模型加入时 Laravel 加入错误