したがって、List<myObj> のディクショナリを取得し、ディクショナリのキーを循環して、各 List<myObj> を別のスレッドに渡すメソッドがあります。
ここにいくつかのコード/擬似コードがあります:
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 オブジェクトが ProcessEntries() で再割り当てされたときに、 ProcessList() 内で myList オブジェクトが変更されるのはなぜですか? これらは 2 つの異なる List ではありませんか? すべてのパラメーターの受け渡しがデフォルトで値渡しである場合、 ProcessList() 関数が myList のローカル コピーを持たないのはなぜですか? (そうですか?)
パラメータをスレッドに渡し、実行中に親スレッドまたは他のスレッドによって変更されないように指定する方法はありますか? (これは、グローバル変数の [ThreadSafe] 属性に似ています)