WorkerThreadPool
Обычные и индексированные задачи общего пула с явным сбором.
WorkerThreadPool использует общий pool движка. AddTask вызывает Callable без аргументов; AddGroupTask передаёт каждому вызову индекс. Результаты и ошибки храните в собственных данных, а не в возвращаемом ID.
Статус завершения не собирает задачу. Один владелец должен вызвать соответствующий Wait один раз, затем перестать использовать ID. Ожидание незавершённой работы может остановить кадр; опрашивайте статус между кадрами и исключите циклы зависимостей.
Для group используйте tasksNeeded=-1 либо положительное число. Ноль при непустой группе в текущей реализации может оставить её незавершённой; ветвь разобрана по исходникам без запуска зависания. Нулевая elements-группа завершена сразу, но тоже требует сбора.
Worker не получает обычный доступ к активному EntityTree. Не меняйте размер общего массива во время обработки и не путайте GetCallerTaskId() с ID группы: в group callback индивидуальный task ID равен −1.
Полный пример пакетной обработки, потокобезопасность. Windows headless-проверки подтверждают lifecycle, индексированные результаты и контекст IDs; ускорение, порядок приоритетов, nested waits и неверные IDs не подтверждены.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Свойства1
SingletonСвойство
public static WorkerThreadPoolInstance Singleton { get; }Заимствованный wrapper общего пула движка; повтор возвращает cached wrapper. Не Dispose/Free Singleton и не пытайтесь завершать весь pool из игрового job. Для задач используйте статические методы и собирайте только собственные task/group IDs.
Методы9
AddGroupTasklong
public static long AddGroupTask(Callable action, int elements, int tasksNeeded = -1, bool highPriority = false, string description = "");Распределяет elements вызовов Callable, каждый с индексом 0…elements−1. tasksNeeded задаёт число рабочих задач, а не число элементов и не гарантированное число одновременно работающих CPU-ядер; −1 выбирает по pool. Не передавайте 0 при elements>0: текущая реализация не создаёт workers и может оставить группу незавершённой; это проверено по исходникам, без запуска зависания. elements=0 создаёт завершённую пустую группу, которую всё равно нужно собрать. Отрицательное elements недопустимо. Результаты складывайте в заранее выделенные независимые слоты; не меняйте размер входа/выхода во время работы. Не предполагается порядок индексов. Завершение подтвердите статусом и вызовите WaitForGroupTaskCompletion один раз.
| Имя | Тип | По умолчанию |
|---|---|---|
action | Callable | — |
elements | int | — |
tasksNeeded | int | -1 |
highPriority | bool | false |
description | string | "" |
actionЖивой Callable: без аргументов для AddTask, с int-индексом для AddGroupTask. Не даёт автоматического доступа к активному дереву.
elementsНеотрицательное число element-вызовов; 0 не вызывает action, но требует сбора созданной группы.
tasksNeeded−1 для автоматического выбора или разумное положительное число workers; не 0 при непустой группе и не произвольное огромное значение.
highPriorityПредпочтение очереди pool; не OS realtime priority и не гарантия порядка/ускорения.
descriptionДиагностическая метка; не идентификатор задачи, не имя файла и не команда.
longGroup ID для статуса и одного сбора либо −1 при отклонённом elements.
AddTasklong
public static long AddTask(Callable action, bool highPriority = false, string description = "");Ставит один Callable без аргументов в общий pool. Возвращается task ID, не результат callback; возвращаемое callback-значение pool не предоставляет. Публикуйте собственный результат через согласованное хранилище. Удерживайте цель Callable и входные данные до завершения. После проверки IsTaskCompleted выполните WaitForTaskCompletion ровно один раз. Получение ID не доказывает успешную работу или корректный Callable; сами проверьте вход. highPriority не гарантирует порядок/ускорение. Для отмены и ошибок реализуйте явный протокол приложения.
| Имя | Тип | По умолчанию |
|---|---|---|
action | Callable | — |
highPriority | bool | false |
description | string | "" |
actionЖивой Callable: без аргументов для AddTask, с int-индексом для AddGroupTask. Не даёт автоматического доступа к активному дереву.
highPriorityПредпочтение очереди pool; не OS realtime priority и не гарантия порядка/ускорения.
descriptionДиагностическая метка; не идентификатор задачи, не имя файла и не команда.
longTask ID для статуса и одного сбора; не callback-результат.
GetCallerGroupIdlong
public static long GetCallerGroupId();Возвращает ID группы текущего group worker. На главном потоке, вне pool или в обычной AddTask-задаче возвращает −1. Не является индексом элемента: индекс приходит аргументом callback. У всех элементов одной группы ID одинаков.
longID текущей группы либо −1 вне group callback.
GetCallerTaskIdlong
public static long GetCallerTaskId();Возвращает ID текущей обычной pool-задачи. Вне pool-контекста — −1. У workers групповой задачи индивидуальный публичный task ID не назначается и результат также −1: для группы используйте GetCallerGroupId. Это не OS thread ID или ID главного потока. Не собирайте задачу из неё самой.
longID обычной текущей задачи либо −1, в том числе в group worker.
GetGroupProcessedElementCountuint
public static uint GetGroupProcessedElementCount(long groupId);Число вызовов элементов, уже завершившихся в группе; не число назначенных workers и не число начатых вызовов. Прибавляется после возврата callback. Даже count==elements не заменяет IsGroupTaskCompleted и обязательный WaitForGroupTaskCompletion. Читайте только до сбора группы; неверный/уже собранный ID даёт диагностику и 0, который не доказывает пустую группу.
| Имя | Тип | По умолчанию |
|---|---|---|
groupId | long | — |
groupIdЕщё не собранный ID группы, которым владеет ваш код; не индекс элемента или обычный task ID.
uintЧисло вернувшихся element callbacks; 0 также возможно для неверного ID с диагностикой.
IsGroupTaskCompletedbool
public static bool IsGroupTaskCompleted(long groupId);Проверяет завершение группы без её сбора. True не освобождает registry-запись: после него нужен один WaitForGroupTaskCompletion. Между кадрами опрашивайте статус, не блокируйте главный поток busy loop. После сбора перестаньте использовать ID. False при неверном ID сопровождается диагностикой и не означает работающую группу.
| Имя | Тип | По умолчанию |
|---|---|---|
groupId | long | — |
groupIdЕщё не собранный ID группы, которым владеет ваш код; не индекс элемента или обычный task ID.
boolTrue при завершении; не подтверждение выполненного сбора.
IsTaskCompletedbool
public static bool IsTaskCompleted(long taskId);Проверяет, вернулся ли обычный task callback. Не извлекает пользовательский результат и не освобождает задачу. После true выполните WaitForTaskCompletion и проверьте Error. После успешного сбора ID больше не используйте. Не передавайте сюда group ID; неверный ID даёт false и native-диагностику.
| Имя | Тип | По умолчанию |
|---|---|---|
taskId | long | — |
taskIdЕщё не собранный ID обычной задачи, которым владеет ваш код; не ID группы/потока.
boolTrue после возврата callback; не пользовательский результат.
WaitForGroupTaskCompletionvoid
public static void WaitForGroupTaskCompletion(long groupId);Ждёт группу и собирает её запись. Блокирует вызывающий поток при незавершённой работе; главный поток на это время не обрабатывает обычные кадры. Назначьте одного владельца сбора, вызовите один раз и забудьте ID. Нельзя ждать группу из callback этой же группы или удерживая нужные ей блокировки: возможен deadlock. Не возвращает результаты/ошибки отдельных элементов; их хранит приложение. Нет timeout/отмены; невалидный ID диагностируется.
| Имя | Тип | По умолчанию |
|---|---|---|
groupId | long | — |
groupIdЕщё не собранный ID группы, которым владеет ваш код; не индекс элемента или обычный task ID.
WaitForTaskCompletionError
public static Error WaitForTaskCompletion(long taskId);Ждёт обычную задачу и собирает её, возвращая Error ожидания, не callback-результат. При Ok перестаньте использовать ID. Незавершённую задачу нельзя ждать из самой себя; pool worker при попытке ждать незавершённую задачу с ID не новее собственной может получить Busy. Busy не означает успешный сбор. Неверный ID даёт InvalidParameter. Внутреннее предотвращение части deadlock не делает произвольные циклы зависимостей безопасными; не удерживайте нужные worker locks и не ждите main-thread действий из заблокированного main thread. Ошибочные nested waits здесь только source-reviewed.
| Имя | Тип | По умолчанию |
|---|---|---|
taskId | long | — |
taskIdЕщё не собранный ID обычной задачи, которым владеет ваш код; не ID группы/потока.
ErrorOk после сбора, InvalidParameter для неверного ID, Busy при запрещённом вложенном ожидании.