Добавление дочернего элемента в Viewport3D в асинхронном режиме приводит к «Доступ к этому API с аргументами из неправильного контекста». - PullRequest
0 голосов
/ 27 ноября 2009

Когда я пытаюсь добавить 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);

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

1 Ответ

2 голосов
/ 09 декабря 2010

Это происходит, когда вы генерируете / изменяете объекты сцены для добавления в 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); 
}
...