Search code examples
processhelix-3d-toolkit

System.InvalidOperationException when drawing into HelixViewPort3D


Always when I want to draw into ViewPort3D out from a process I get a System.InvalidOperationException.

What is it I do not understand?

Is a process not able to access the ui process?

How can I solve this problem?

            private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Random r = new Random();
            DrawSphere(counter, Colors.Red, (double)r.Next(400) / 100);
            counter++;
        }

        private void DrawSphere(int i, Color color, double radius)
        {
            SphereVisual3D sphere = new SphereVisual3D();
            sphere.Center = new Point3D(i * 5, counter * 5, 0);
            sphere.Visible = true;
            sphere.Fill = new SolidColorBrush(color);
            sphere.Radius = radius;
            viewPort.Children.Add(sphere);
        }

Solution

  • You need to use the dispatcher to check the access. You have 2 options: First Option:

        private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
            {
                Random r = new Random();
                Application.Current.Dispatcher.Invoke(new Action(() => DrawSphere(counter, Colors.Red, (double)r.Next(400) / 100)));
                counter++;
            }
    

    Second Option:

                private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
            {
                Random r = new Random();
                DrawToViewPort(counter, Colors.Red, (double)r.Next(400) / 100);
                counter++;
    
            }
    
            private void DrawToViewPort(int i, Color color, double radius)
            {
                if (viewPort.Dispatcher.CheckAccess())
                {
                    DrawSphere(i, color, radius);
                }
                else
                {
                    viewPort.Dispatcher.Invoke((Action<int, Color, double>)DrawToViewPort, i, color, radius);
                }
            }