Асинхронное добавление дочернего элемента в Viewport3D дает & # 8220; доступ к этому API был получен с аргументами из неправильного контекста. & # 8221;
-
05-07-2019 - |
Вопрос
Когда я пытаюсь добавить 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);
}