c # как ждать завершения внешнего кода - PullRequest
0 голосов
/ 09 ноября 2018

Мое приложение общается с другим программным обеспечением (Catia V6 / 3DEXPERIENCE), используя различные .dll.

Некоторые функции в этом интерфейсе работают асинхронно, что иногда приводит к сбоям в моем сценарии.

Типы «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 #. Я пытался использовать Task и Process, но, если честно, я совершенно заблудился, как их реализовать в этой ситуации.

...