Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从从另一个线程填充的对象读取数据_C#_Multithreading_Object Sharing - Fatal编程技术网

C# 从从另一个线程填充的对象读取数据

C# 从从另一个线程填充的对象读取数据,c#,multithreading,object-sharing,C#,Multithreading,Object Sharing,语言:cwpf 情况:我必须从文件中加载3D网格,然后填充Viewport3D 我想做什么:我想在BackgroundWorker中加载3D网格,这样应用程序在加载3D网格时不需要暂停;这需要几秒钟 问题:问题不在于如何使用BackgroundWorker。这是有据可查的。当我要填充Viewport3D的Model3DGroup 3D对象组时,会出现问题 从文件加载3D网格时,在后台工作程序中,我使用网格中每个对象的所有点和三角形索引填充自定义网格类。我分别将它们存储在Point3DCollec

语言:cwpf

情况:我必须从文件中加载3D网格,然后填充Viewport3D

我想做什么:我想在BackgroundWorker中加载3D网格,这样应用程序在加载3D网格时不需要暂停;这需要几秒钟

问题:问题不在于如何使用BackgroundWorker。这是有据可查的。当我要填充Viewport3D的Model3DGroup 3D对象组时,会出现问题

从文件加载3D网格时,在后台工作程序中,我使用网格中每个对象的所有点和三角形索引填充自定义网格类。我分别将它们存储在Point3DCollections和Int32Collections中

public class LFSMeshObject
{
    public Point3D Center;
    public int Radius;
    public int NumPoints;
    public int NumTris;

    public Color ObjectColor { get; private set; }
    public Point3DCollection Points { get; private set; }
    public Int32Collection Tris { get; private set; }
当这个填充的对象被传递回GUI线程时,我可以很好地读取对象中存储的所有值和属性。我还可以读取复制到MeshGeometry3D中的Point3Dcollections和Int32Collections,这些集合进入Model3DGroup,但随后会得到线程所有者异常,因为后台填充对象的属性属于后台线程

    DiffuseMaterial mDMat;
    MeshGeometry3D mGeom;
    Debug.WriteLine("num objects in mesh : {0}", _trackMesh.NumObjects);
    for (int a = 0; a < _trackMesh.NumObjects; a++)
    {
        mGeom = new MeshGeometry3D();
        mGeom.Positions = _trackMesh.TrackMeshObjects[a].Points;
        mGeom.TriangleIndices = _trackMesh.TrackMeshObjects[a].Tris;

        mDMat = new DiffuseMaterial();
        mDMat.Brush = new SolidColorBrush(_trackMesh.TrackMeshObjects[a].ObjectColor);

        // thread owner exception
        _mgTrack.Children.Add(new GeometryModel3D(mGeom, mDMat));
    }
问题是我正在读取对象Point3DCollection/Int32Collection,而不是从后台填充的对象复制的普通值?
是这样的吗?当您在线程之间共享数据时,您必须创建要在其他对象中使用的所有数据的副本,例如,其他线程中的MeshGeometry/Modelgroup?我们不能在后台填充一个对象,然后在填充完成后在另一个线程中“简单地使用它”吗?

一个简单而肮脏的尝试是将函数指针委托回调传递到从gui线程启动的线程的上下文。该委托本质上会在您想要将其读回gui线程的确切时刻返回您想要读取的内容。因此,回调是在主线程上创建的。这应该行得通

与此同时,我通过使用普通的Point3D[]和int[]数组而不是xxxCollection对应数组来解决这个问题。然后,当我用这些数组填充三维模型时,它工作得很好。没有线程所有权错误。奇怪的但显然,在后台线程上创建的某些对象无法在另一个线程中访问,或者我可能遗漏了一些东西-我只使用了c 1.5个月。

上述方法在DoWork方法中不正确?设置网格几何体的循环代码位在GUI线程中。我现在的顺序是:启动后台工作程序,它初始化一个类,该类使用文件中的网格数据填充自己。完成后,后台工作程序将该对象传递回gui线程,然后gui线程填充实际的MeshGeometry3D和GeometryModel3D。如果我不使用Point3DCollection和/或Int32Collection对象,这是可行的。我必须使用普通的Point3D[]和int[]数组。如果WPF控件绑定到后台填充的对象,那么当工作线程更新该对象时,如何防止UI线程尝试访问该对象?在许多应用程序中,UI线程需要自由地为WPF网格上的用户操作或其他任何操作提供服务。。。我在WPF方面没有太多的经验,但我收集了很多XAML运行时生成的代码,我没有访问这些代码的权限。