Итак, у меня есть метод, который получает словарь списка , затем циклически перебирает ключи словаря и передает каждый список в отдельный поток.
Вот код / Psuedo-Code:
public static void ProcessEntries() {
Dictionary<string, List<myObj>> myDictionary = GetDictionary();
foreach(string key in myDictionary.keys)
{
List<myObj> myList = myDictionary[key];
Thread myThread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() {
ProcessList(myList);
}
}
}
public static void ProcessList(List<myObj> myList) {
// Process entries
// read-only operations on myList
}
Проблема заключается в том, что во время выполнения ProcessList параметр myList просто изменяется.
Я прошел по списку перед тем, как начать работу с потоком, а затем непосредственно внутри потока.и я обнаружил, что результаты отличаются.
С тех пор я решил проблему (я думаю!), сделав переменную Dictionary глобальной.Использование свойства [ThreadStatic] является следующим в списке возможных исправлений.
Что я действительно хочу знать, так это то, почему объект myList изменяется внутри ProcessList (), предположительно, когда объект myList переназначается в ProcessEntries ()Разве это не два разных списка?Если вся передача параметров по умолчанию выполняется по значению, почему функция ProcessList () не имеет локальной копии myList?(не так ли?)
Есть ли способ указать, что вы хотите передать параметр потоку, а не изменять его родительским потоком или другими потоками во время выполнения?(Это будет похоже на атрибут [ThreadSafe] для глобальных переменных)