2015-09-24 4 views
0

У меня есть многопоточное приложение. Диспетчера потоков содержит список объектов dbNodeListПроблемы с копированием списка t в потоки

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

В связи с ThreadManager NodePath и имя_узла константы, которые предварительно заполнены. В рабочем потоке узловое значение выводится из обрабатываемого XML-сообщения.

Когда threadmanager запускает новый поток, он должен предоставить потоку истинную копию этого списка, поэтому, когда заполнение nodevalue заполнено, оно уникально для этого потока.

Так при запуске нить я не могу просто сказать

NewThread.nodeList = ThreadManager.nodeList; , как я думаю, это просто установка ссылки на список TheadManager. Если thread_1 устанавливает значение nodevalue, а затем thread_2 устанавливает его в другое значение, не будет ли он теперь некорректным в thead_1?

Спасибо, колее

+0

Вы пробовали? – Shawn

+0

См. [Эту статью] (http://theburningmonk.com/2010/10/threadstatic-vs-threadlocal/). – user1620220

ответ

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 см связанным вопроса для объяснения различий.

0

Класс является ссылочным типом, поэтому да, ваш новый поток будет просто получать ссылку на существующий класс. Клонирование - это то, что вы хотите сделать, если ручное заполнение класса нецелесообразно. Самый простой метод, который я нашел, - это использовать сериализацию. Здесь есть отличная почта: Deep cloning objects

Смежные вопросы