2013-09-29 1 views
0

전 세계적으로 선언 된 목록이 있습니다. foreach 루프를 사용하여 데이터를 가져 와서 특정 레코드로 작업하기 위해 스레드 을 만듭니다. 각 스레드는 하나의 데이터로만 작업해야합니다. 하지만 그 스레드와 함께 작업 할 때 스레드는 여러 번 여러 데이터로 작동합니다. 몇 번이나 동일한 데이터가 두 번 있습니다. 스레드의 동기화 방법이 있습니까? 내 필요가 : 작업이 완료되면 각 스레드가 해당 특정 값으로 열리고 닫힙니다.. 적절한 해결책을 제안하십시오. 아래 내 코드의 세부 사항을 확인하십시오 :foreach 내에서 호출 할 때 C# 스레드를 동기화

foreach (string[] OutBoxFields in OutboxList) 
    {    

    // default value of OutBoxFields[6] is QUE. Values are: a,b,c,d,e 
    Console.WriteLine("From foreach loop: Data:" + OutBoxFields[2] + "|Status:" + OutBoxFields[6] + "\n");     
    Thread OutboxThread = new Thread(() => OutboxThreadProcessor(OutBoxFields)); 
    OutboxThread.Start(); 

} 

스레드 방법은 :

static void OutboxThreadProcessor(string[] OutBoxFields) 
    { 

     string var = "a"; 
     if (OutBoxFields[2] == var) 
     OutBoxFields[6] = "SENT"; 

     Console.WriteLine("From Thread Method: Data:" + OutBoxFields[2] + "|Status:" + OutBoxFields[6] + "\n"); 
} 

을 확인

public static List<string[]> OutboxList = new List<string[]>(); 

목록 및 오픈 스레드에서 데이터를 가져 오기 :

세계적으로 목록을 선언 작업 완료시 배열 :

foreach (string[] NewOutBoxFields in OutboxList) 
     { 

     Console.WriteLine("From new foreach:" + NewOutBoxFields[2] + "|" + NewOutBoxFields[6] + "\n");      

     } 

전류 출력 :

From foreach loop: Data:c|Status:QUE 
From foreach loop: Data:d|Status:QUE 
From foreach loop: Data:a|Status:QUE 
From foreach loop: Data:e|Status:QUE 
From Thread Method: Data:e|Status:QUE 
From Thread Method: Data:e|Status:QUE 
From foreach loop: Data:b|Status:QUE 
From Thread Method: Data:e|Status:QUE 
From Thread Method: Data:b|Status:QUE 
From Thread Method: Data:b|Status:QUE 
From new foreach:c|QUE 
From new foreach:d|QUE 
From new foreach:a|QUE 
From new foreach:e|QUE 
From new foreach:b|QUE 

예상 출력 :

From foreach loop: Data:c|Status:QUE 
From Thread Method: Data:c|Status:QUE 
From foreach loop: Data:d|Status:QUE 
From Thread Method: Data:d|Status:QUE 
From foreach loop: Data:a|Status:QUE 
From Thread Method: Data:a|Status:SENT 
From foreach loop: Data:e|Status:QUE 
From Thread Method: Data:e|Status:QUE 
From foreach loop: Data:b|Status:QUE 
From Thread Method: Data:b|Status:QUE 
From new foreach:c|QUE 
From new foreach:d|QUE 
From new foreach:a|SENT 
From new foreach:e|QUE 
From new foreach:b|QUE 

답변

0

귀하의 문제는 지역 변수 OutBoxFields는 새로운 스레드에 전달하기 전에 포착되지 않는 것입니다. 대신 쓰레드는 그 시점에 도달하면 해당 변수의 현재 값을 읽습니다.

foreach (string[] OutBoxFields in OutboxList) 
{ 
    Thread OutboxThread = new Thread((fields) => OutboxThreadProcessor(fields)); 
    OutboxThread.Start(OutBoxFields); 
} 
:

은 어쩌면 당신은 명시 적으로 대신 "상태 개체"로 개체를 전달한다

관련 문제