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

时间:2015-09-24 19:48:44

标签: c# multithreading

我有一个多线程应用程序。线程管理器包含dbNodeList

的对象列表
class dbNodeList
{
    public string nodepath;
    public string nodename;
    public string nodevalue;
    //etc...
}

在ThreadManager中,nodepath和nodename是预先填充的常量。在工作线程中,nodevalue被拉出正在处理的xml消息。

当threadmanager启动一个新线程时,它需要为该线程提供该列表的真实副本,因此当填充nodevalue时,它对该线程是唯一的。

因此,在启动一个帖子时,我不能只说

NewThread.nodeList = ThreadManager.nodeList; 因为我认为这只是设置对TheadManager列表的引用。如果thread_1设置了nodevalue,然后thread_2将它设置为另一个值,那么现在在thead_1中是不是不正确?

谢谢, 辙

2 个答案:

答案 0 :(得分:0)

您需要手动实现一个复制功能,该功能将创建一个新对象并将值复制过来。

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();

任何可变引用类型的对象都需要额外的工作才能使其成为deep copy instead of a shallow copy,请参阅链接的问题以解释差异。

答案 1 :(得分:0)

一个类是一个引用类型,所以是的,你的新线程只是获得对现有类的引用。如果手动填充类不可行,则克隆是您要执行的操作。我发现最简单的方法就是使用序列化。这里有一篇很棒的帖子:Deep cloning objects