2014-05-22 2 views
2

값이 긴 값을 작업에 전달하는 데 문제가 있습니다.C#의 작업에 값 매개 변수 전달

나는 각각의 루프를 통해 반복되는 ID 목록을 가지고 로컬 변수에 할당 한 다음 매개 변수로 새 작업에 전달합니다. 라운드를 반복하고 다음 ID를 처리하기 전에 작업이 완료 될 때까지 기다리지 않습니다. 나는 일련의 작업을 유지하지만 이것은 부적절하다.

loop 
    long ID = list[index]; 
    task[index] = Task.Factory.StartNew(() => doWork(ID)); 
end loop 

예를 들어 100 및 200에 대한 포함 된 목록은 내가 200를 호출 한 후 100 두 번째 작업 호출 첫 번째 작업을 할 것입니다하지만이 그래서 그렇지, doWork 두 작업 (200)를 수신하는 경우 값이 복사되면 문제가 발생합니다.

내가 위의 코드는 항상 내가 전환하는 작업 상태를 기다리는 코드를 수정 200

호출

방법을 표시합니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     long num = 100; 
     Task one = Task.Factory.StartNew(() => doWork(num)); 
     num = 200; 

     Console.ReadKey(); 
    } 

    public static void doWork(long val) 
    { 
     Console.WriteLine("Method called with {0}", val); 
    } 
} 

몇 가지 간단한 콘솔 코드로 설명 할 수 있습니다 WaitingToRun

static void Main(string[] args) 
{ 
    long num = 100; 
    Task one = Task.Factory.StartNew(() => doWork(num)); 
    while(one.Status == TaskStatus.WaitingToRun) 
    {} 
    num = 200; 

    Console.ReadKey(); 
} 

(200)는 또한 다음과 같은

while (true) 
{ 
    if (one.Status == TaskStatus.Running | one.IsCompleted == true) 
    break; 
} 

을 시도했지만 다시 200가 표시있어 함께하지만 100 % 증거, 내가 가진 몇 실행 후 방법했다.

작업 완료까지 기다리지 않고 작업에 전달 된 값을 어떻게 보장 할 수 있습니까?

어떤 도움/제안 에이드

답변

7

당신이 작업이 완료 될 때까지 기다리지 않고 작업에 전달 된 값을 보장 할 수있는 방법 어떤 아이디어를 평가?

확실히 - 다른 곳에서는 이 아닌 별도의 변수를 만들어으로 수정하십시오. 당신은 할 새로운 범위를 사용할 수 명확한 :

long num = 100; 
Task one; 
{ 
    // Nothing can change copyOfNum! 
    long copyOfNum = num; 
    one = Task.Factory.StartNew(() => doWork(copyOfNum)); 
} 

당신은 오히려 변수를 캡처보다 "대리인이 생성 된 변수의 값을"캡처하는 C# 컴파일러를 변경할 수는 없지만 확인 할 수 있습니다 변수는 이후에 변경되지 않으므로 동일한 결과를 얻을 수 있습니다.

+0

내 하루를 ... :) – Rohit