그래서 Dictionary of List <myObj>을 얻은 다음 사전의 키를 순환하고 각 목록 <myObj>을 별도의 스레드에 전달하는 메서드가 있습니다.C# 스레드 실행 중 스레드 매개 변수가 변경됩니다 - 이유는 무엇입니까?
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] 속성과 비슷합니다.)
코드/psuedocode가 정확하고 완전합니까? 내가 볼 수있는 것부터, 무슨 일이 일어나는가에 대한 가정은 틀린 반면 코드가 정상적으로 작동해야하는 것처럼 보입니다. –