title: C# Thread Parameters change during thread execution - why?
body: <p>So I have a method that gets a Dictionary of List&lt;myObj&gt;, then cycles through the keys of the dictionary and passes each List&lt;myObj&gt; to a separate thread.</p>
  
  <p>Here is some Code / Psuedo-Code:</p>
  
  <pre><code>public static void ProcessEntries() {
  
      Dictionary&lt;string, List&lt;myObj&gt;&gt; myDictionary = GetDictionary();
  
      foreach(string key in myDictionary.keys)
      {
  
          List&lt;myObj&gt; myList = myDictionary[key];
  
          Thread myThread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() {
  
              ProcessList(myList);
  
          }    
      }
  }
  
  public static void ProcessList(List&lt;myObj&gt; myList) {
  
      // Process entries
      // read-only operations on myList
  
  }
  </code></pre>
  
  <p>The problem is that during execution of ProcessList the myList parameter simply changes.</p>
  
  <p>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.</p>
  
  <p>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.</p>
  
  <p>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?)</p>
  
  <p>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)</p>