Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 将t的列表复制到线程时出现问题_C#_Multithreading - Fatal编程技术网

C# 将t的列表复制到线程时出现问题

C# 将t的列表复制到线程时出现问题,c#,multithreading,C#,Multithreading,我有一个多线程应用程序。线程管理器包含dbNodeList的对象列表 class dbNodeList { public string nodepath; public string nodename; public string nodevalue; //etc... } 在ThreadManager中,nodepath和nodename是预先填充的常量。在工作线程中,节点值从它正在处理的xml消息中提取出来 当threadmanager启动一个新线程时,它需

我有一个多线程应用程序。线程管理器包含dbNodeList的对象列表

class dbNodeList
{
    public string nodepath;
    public string nodename;
    public string nodevalue;
    //etc...
}
在ThreadManager中,nodepath和nodename是预先填充的常量。在工作线程中,节点值从它正在处理的xml消息中提取出来

当threadmanager启动一个新线程时,它需要给该线程一个该列表的真实副本,这样当节点值被填充时,它对该线程是唯一的

因此,当启动一个线程时,我不能只说

NewThread.nodeList=ThreadManager.nodeList; 我认为这只是对TheadManager列表的引用。如果线程_1设置nodevalue,然后线程_2将其设置为另一个值,那么它现在在ad_1中不是不正确吗

谢谢,
Rut

您需要手动实现一个复制功能,该功能将创建一个新对象,并在上面复制值

class dbNodeList
{
    public string nodepath;
    public string nodename;
    public string nodevalue;
    //etc...

    public dbNodeList Copy()
    {
        var copy = new dbNodeList();
        copy.nodepath = this.nodepath;
        copy.nodename = this.nodename;
        copy.nodevalue = this.nodevalue;
        //etc...

        return copy;
    }
}

//used like
NewThread.nodeList = ThreadManager.nodeList.Copy();

任何可变引用类型的对象都需要对其进行额外的处理,才能使其成为一个类,有关差异的解释,请参见链接问题。

类是一个引用类型,因此是的,您的新线程将只获得对现有类的引用。如果手动填充类不可行,则需要进行克隆。我发现最简单的方法就是使用序列化。这里有一个很棒的帖子:

请看。