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;
}
}
}
-1 : 당신은 람다 식 내부 사용자 변수의 로컬 복사본을 생성하기 만하면 무엇
새로
Task
을 생성하기 위해 전달되는 당신은 궤도에,하지만이 구현은 것 'Payload' 타입이'struct' 일 때 작동합니다. 저는 그러한 가정을하기에 충분한 정보가 제공되었다고 믿지 않습니다. –@Sam 이것은 구조체와 아무 관련이 없습니다. 왜 그렇게 생각하니? –
@Sam 참조 형식 클로저도 비슷한 효과가 있습니다. http://lostechies.com/derickbailey/2009/02/23/closures-in-c-variable-scoping-and-value-types-vs-reference-types/ –