4

これは興味深いものです。たくさんの を作成するサービスがありますTask。現在、リストには 2 つのタスクのみが設定されています。ただし、Taskアクション内にブレークポイントを配置して の値を調べるschedule.Nameと、同じスケジュール名で 2 回ヒットします。ただし、2 つの別個のスケジュールが構成されており、スケジュール リストにあります。タスクがループ内の最後のスケジュールを再利用する理由を誰か説明できますか? これはスコープの問題ですか?

// 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
4

1 に答える 1

5

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
                                );
    }


} //

クロージャーとループ変数の詳細については、「 有害と見なされるループ変数を閉じる」を参照してください。

于 2013-03-06T11:14:59.220 に答える