Запрос
Добавить методы прерывания/отмены выполнения фонового задания в стандартную библиотеку.
Текущее состояние
Класс ФоновоеЗадание (src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs) сейчас имеет только метод ОжидатьЗавершения(timeout), который позволяет перестать ждать, но не прерывает фактическое выполнение. Зависший callback продолжит работу до завершения процесса, потенциально утекая память и ресурсы.
В 1С:Предприятии у ФоновоеЗадание есть Прервать() и ОтменитьЗадание() — было бы полезно иметь паритет (хотя бы soft-cancel через флаг отмены).
Кейс использования
Реализуем OpenTelemetry SDK на OneScript (nixel2007/opentelemetry). Спецификация Metrics SDK требует:
The implementation SHOULD use a timeout to prevent indefinite callback execution.
Сейчас можно сделать только soft-timeout: запустить callback в ФоновыеЗадания.Выполнить, через ОжидатьЗавершения(таймаут) перестать ждать, а измерения отбросить. Зомби-задание остаётся в фоне до конца процесса.
Предложение
Один из вариантов:
- Hard cancel —
Прервать(), аналог Thread.Abort (deprecated в .NET, не очень рекомендуется).
- Cooperative cancel —
ОтменитьЗадание() ставит CancellationToken, который пользовательский код может проверять через ФоновыеЗадания.ПолучитьТекущее().Отменено(). Под капотом — CancellationTokenSource.
Cooperative cancel предпочтительнее: совпадает с .NET-практикой, не убивает поток, безопасно. Можно реализовать через свойство Отменено и метод ОтменитьЗадание() у BackgroundTask, прокидывая CancellationToken в внутренний Task.
Workaround
Пока используем soft-timeout с явной документацией платформенного ограничения. Ссылка на этот issue: TBD
Запрос
Добавить методы прерывания/отмены выполнения фонового задания в стандартную библиотеку.
Текущее состояние
Класс
ФоновоеЗадание(src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs) сейчас имеет только методОжидатьЗавершения(timeout), который позволяет перестать ждать, но не прерывает фактическое выполнение. Зависший callback продолжит работу до завершения процесса, потенциально утекая память и ресурсы.В 1С:Предприятии у
ФоновоеЗаданиеестьПрервать()иОтменитьЗадание()— было бы полезно иметь паритет (хотя бы soft-cancel через флаг отмены).Кейс использования
Реализуем OpenTelemetry SDK на OneScript (nixel2007/opentelemetry). Спецификация Metrics SDK требует:
Сейчас можно сделать только soft-timeout: запустить callback в
ФоновыеЗадания.Выполнить, черезОжидатьЗавершения(таймаут)перестать ждать, а измерения отбросить. Зомби-задание остаётся в фоне до конца процесса.Предложение
Один из вариантов:
Прервать(), аналогThread.Abort(deprecated в .NET, не очень рекомендуется).ОтменитьЗадание()ставитCancellationToken, который пользовательский код может проверять черезФоновыеЗадания.ПолучитьТекущее().Отменено(). Под капотом —CancellationTokenSource.Cooperative cancel предпочтительнее: совпадает с .NET-практикой, не убивает поток, безопасно. Можно реализовать через свойство
Отмененои методОтменитьЗадание()уBackgroundTask, прокидываяCancellationTokenв внутреннийTask.Workaround
Пока используем soft-timeout с явной документацией платформенного ограничения. Ссылка на этот issue: TBD