Skip to content

Реестр фоновых заданий опирается на Task.Id, который повторяется после переполнения #1758

Description

@sfaqer

МенеджерФоновыхЗаданий хранит задания по Task.Id рабочей задачи, а ПолучитьТекущее() ищет задание по Task.CurrentId. Task.Id — общий счетчик процесса: он выдается при первом чтении Id, после int.MaxValue уходит в отрицательные и через 2^32 выдач повторяется.

Если к этому моменту в реестре еще выполняется задание со старым id (например, вечный главный цикл сервера):

  • новое задание не попадает в реестр (TryAdd вернет false): его не вернет ПолучитьФоновыеЗадания() и не дождется ОжидатьЗавершенияЗадач();
  • ПолучитьТекущее() в новом задании вернет старое задание.

При 1000 заданий в секунду это примерно 50 дней работы процесса.

Предложение: завести для реестра свой счетчик long, а текущее задание хранить в [ThreadStatic]-поле, которое менеджер выставляет на время выполнения, с восстановлением прежнего значения (Task.Wait может выполнить задачу прямо на ждущем потоке). Делать лучше после #1745, он меняет те же места.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions