2014-09-29 3 views
0

Process 메서드가 호출 될 때마다 payload.DaysRemaining 값이 0으로 재설정됩니다.작업을 사용하여 for 루프 내에서 상태 유지

나는 실행할 태스크가 들어있는 메소드가 그 안에 선언 된 태스크 객체와 독립적으로 실행되어 포함 된 메소드 내에서 선언 된 변수가 느슨한 상태가된다는 것을 알고 있습니다.

그래서 메서드 범위 변수에 의존하는 작업을 사용하여 for 루프 내에서 상태를 유지 관리 할 수 ​​있습니까?

private static async Task Assign(Payload payload) 
{ 
    var duration = payload.DaysRemainingToJobsDue.First().Key; 
    var tasks = new List<Task>(); 

    for (var daysRemaining = duration; daysRemaining >= 0; daysRemaining--) 
    { 
     payload.DaysRemaining = daysRemaining; 

     var task = new Task(() => 
     { 
      Process(payload); 
     }); 

     tasks.Add(task); 
     task.Start(); 
    } 

    Task.WaitAll(tasks.ToArray()); 
    return; 
} 

private static void Process(object state) 
{ 
    var payload = state as Payload; 

    foreach (var job in payload.Jobs) 
    { 
     var compareResult = job.DueDate.CompareTo(DateTime.Now.AddDays(payload.DaysRemaining)); 

     var withinRange = compareResult <= 0; 

     if (withinRange) 
     { 
      HashSet<Job> existingJobsDue = null; 
      var pendingJobsExist = payload.DaysRemainingToJobsDue.TryGetValue(payload.DaysRemaining, out existingJobsDue); 

      if (pendingJobsExist) 
      { 
       existingJobsDue.Add(job); 
      } 
      else 
      { 
       existingJobsDue = new HashSet<Job>(); 
       existingJobsDue.Add(job); 
      } 

      payload.DaysRemainingToJobsDue[payload.DaysRemaining] = existingJobsDue; 
     } 
    } 
} 

답변

0

이 효과를 closure이라고합니다.

var task = new Task(() => 
{ 
    var localPayload = payload; 
    Process(localPayload); 
}); 
+0

-1 : 당신은 람다 식 내부 사용자 변수의 로컬 복사본을 생성하기 만하면 무엇

새로 Task을 생성하기 위해 전달되는 당신은 궤도에,하지만이 구현은 것 'Payload' 타입이'struct' 일 때 작동합니다. 저는 그러한 가정을하기에 충분한 정보가 제공되었다고 믿지 않습니다. –

+0

@Sam 이것은 구조체와 아무 관련이 없습니다. 왜 그렇게 생각하니? –

+0

@Sam 참조 형식 클로저도 비슷한 효과가 있습니다. http://lostechies.com/derickbailey/2009/02/23/closures-in-c-variable-scoping-and-value-types-vs-reference-types/ –

관련 문제