使用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;
        }
    }
}

使用Tasks在for循环中维护状态

这种效果被称为闭包

您需要做的是在传递给新创建的Task:的lambda表达式中创建变量的本地副本

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