运行多个任务重用同一个对象实例

本文关键字:一个对象 实例 任务 运行 | 更新日期: 2023-09-27 18:02:36

这里有一个有趣的例子。有一个服务生成了一堆Task。目前,列表中只配置了两个任务。但是,如果我在Task操作中放置一个断点并检查schedule.Name的值,则会使用相同的调度名称命中两次。但是,在计划列表中配置了两个单独的计划。谁能解释一下为什么Task重用循环中的最后一个调度?这是范围问题吗?

// make sure that we can log any exceptions thrown by the tasks
TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
// kick off all enabled tasks
foreach (IJobSchedule schedule in _schedules)
{
    if (schedule.Enabled)
    {
        Task.Factory.StartNew(() =>
                                {
                                    // breakpoint at line below. Inspecting "schedule.Name" always returns the name 
                                    // of the last schedule in the list. List contains 2 separate schedule items.
                                    IJob job = _kernel.Get<JobFactory>().CreateJob(schedule.Name);
                                    JobRunner jobRunner = new JobRunner(job, schedule);
                                    jobRunner.Run();
                                },
                                CancellationToken.None, 
                                TaskCreationOptions.LongRunning, 
                                TaskScheduler.Default
                                );
    }
} // next schedule

运行多个任务重用同一个对象实例

如果您在foreach循环中使用临时变量,它应该可以解决您的问题。

foreach (IJobSchedule schedule in _schedules)
{
    var tmpSchedule = schedule;
    if (tmpSchedule.Enabled)
    {
        Task.Factory.StartNew(() =>
                                {
                                    // breakpoint at line below. Inspecting "schedule.Name" always returns the name 
                                    // of the last schedule in the list. List contains 2 separate schedule items.
                                    IJob job = _kernel.Get<JobFactory>().CreateJob(tmpSchedule.Name);
                                    JobRunner jobRunner = new JobRunner(job, tmpSchedule);
                                    jobRunner.Run();
                                },
                                CancellationToken.None, 
                                TaskCreationOptions.LongRunning, 
                                TaskScheduler.Default
                                );
    }

} //

有关闭包和循环变量的进一步参考,请参见关闭被认为有害的循环变量