我有一个多线程应用程序。线程管理器包含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中是不是不正确?
谢谢, 辙
答案 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