The payload.DaysRemaining value gets reset to zero each time the Process method gets invoked.
I understand that the method containing the task to be executed will execute independent of the task object declared within it which results in the variables declared within the containing method to loose state.
So how do I maintain state within a for loop using tasks that rely on method scoped variables?
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;
}
}
}