使用Tasks在for循环中维护状态
本文关键字:维护 状态 循环 for Tasks 使用 | 更新日期: 2023-09-27 18:24:49
有效载荷。每次调用Process方法时,DaysRemaining值都会重置为零。
我知道,包含要执行的任务的方法将独立于其中声明的任务对象执行,这会导致包含方法中声明的变量处于松散状态。
那么,如何使用依赖于方法范围变量的任务来维护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;
}
}
}
这种效果被称为闭包。
您需要做的是在传递给新创建的Task
:的lambda表达式中创建变量的本地副本
var task = new Task(() =>
{
var localPayload = payload;
Process(localPayload);
});