【发布时间】:2010-08-05 16:48:03
【问题描述】:
所以我有一个方法可以获取 List
这是一些代码/伪代码:
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() 中重新分配时,为什么 myList 对象会在 ProcessList() 中发生变化?这不是两个不同的列表吗?如果默认情况下所有参数传递都是按值传递的,为什么 ProcessList() 函数没有 myList 的本地副本? (是吗?)
有没有办法指定您希望将参数传递给线程,并且在执行期间不让父线程或其他线程更改它? (这类似于全局变量的 [ThreadSafe] 属性)
【问题讨论】:
-
您确定您的代码/伪代码正确且完整吗?据我所知,虽然您对发生的事情的假设是错误的,但看起来代码应该可以正常工作。
标签: c# multithreading parameter-passing threadstatic