So I have a method that gets a Dictionary
of List<myObj>
, then cycles through the keys of the dictionary and passes each List<myObj>
to a separate thread.
Here is some Code / 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 Thread(new ThreadStart(delegate()
{
ProcessList(myList);
}
}
}
public static void ProcessList(List<myObj> myList)
{
// Process entries
// read-only operations on myList
}
The problem is that during execution of ProcessList
the myList
parameter simply changes.
I have looped through the list before kicking of the thread, and then immediately inside the thread, and I've found the results to be different.
I have since solved the problem (I think!) by making the Dictionary
variable global. Using the [ThreadStatic]
property is next on the list of possible fixes.
What I really want to know is why does the myList
object changes inside ProcessList()
presumably when the myList
object is re-assigned in ProcessEntries()
? Are these not two different Lists
? If all parameter passing is by value by default, why does the ProcessList()
function not have a local copy of myList
? (does it?)
Is there a way to specify that you want to pass a parameter to a thread and not have it be altered by the parent thread or other threads during execution? (This would be similar to the [ThreadSafe]
attribute for global variables)
Also be sure that other threads don't affect the thread you're trying to use. be sure to use locks and monitors... Had some issues with that just few weeks ago..