Асинхронное добавление дочернего элемента в Viewport3D дает & # 8220; доступ к этому API был получен с аргументами из неправильного контекста. & # 8221;

StackOverflow https://stackoverflow.com/questions/1808417

Вопрос

Когда я пытаюсь добавить 3D-контент в Viewport3D, асинхронно, это приводит к " Доступ к этому API был получен с аргументами из неправильного контекста. " в исключении TargetInvocationException.

3D-контент генерируется из данных устройства 3D-сканирования. Необходимые для этого сообщения и вычисления выполняются в отдельном потоке. Сначала я попытался получить доступ к viewport3D из этого потока. Я понял, что это должно быть сделано GUI-потоком, поэтому теперь я использую этот код:

        ModelVisual3D model = new ModelVisual3D();
        model.Content = scanline;

        DispatcherOperation dispOp = this.viewport.Dispatcher.BeginInvoke(
            new AddModelDelegate(StartAddModel), model);
    }
    private void StartAddModel(ModelVisual3D model)
    {
        this.viewport.Children.Add(model); 
        //model is not in the context of this current thread. 
        //Throws exception: "This API was accessed with arguments from the wrong context."
    }

    private delegate void AddModelDelegate(ModelVisual3D model);

Похоже, что объект с именем " модель " не находится в контексте текущего потока. Как я могу это исправить? Есть ли способ вывести модель в контекст диспетчера? Или этот способ просто не подходит?

Это было полезно?

Решение

Это происходит, когда вы генерируете / изменяете объекты сцены для добавления в Viewport из другого потока, в котором был создан экземпляр одного Viewport. Есть простая работа вокруг. Инкапсулируйте код, который обновляет объекты Viewport в функцию. Вставьте следующий фрагмент, и все готово.

private delegate void MyFunctionDelegate();
void MyFunction()
{
     if(!Application.Current.Dispatcher.CheckAccess())
     {
         Application.Current.Dispatcher.Invoke(new MyFunctionDelegate(MyFunction));
         return; // Important to leave the culprit thread
     }
     .
     .
     .
     this.Viewport3D.Children.Remove(model);
     MyModifyModel(model);
     this.Viewport3D.Children.Add(model); 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top