Событие создания потока ThreadPool

Есть ли способ получать уведомления (например, через событие или обратный вызов) всякий раз, когда создается новый поток ThreadPool? Я работаю над консольным приложением .net, которое использует библиотеку pjlib через P/Invoke. Эта библиотека требует, чтобы каждый поток, использующий любой из ее API, был предварительно зарегистрирован через pj_thread_register API:

Register a thread that was created by external or native API to PJLIB. This function must be called in the context of the thread being registered. When the thread is created by external function or API call, it must be 'registered' to PJLIB using pj_thread_register(), so that it can cooperate with PJLIB's framework. During registration, some data needs to be maintained, and this data must remain available during the thread's lifetime.

При попытке вызвать любую функцию pjlib из незарегистрированного потока библиотека действительно выдаст сообщение:

Calling pjlib from unknown/external thread. You must
register external threads with pj_thread_register()
before calling any pjlib functions.

Теперь бизнес-логика приложения использует async и await, и, поскольку это консольное приложение, SynchronizationContext имеет значение null, что означает, что все продолжения будут выполняться в потоках ThreadPool, включая вызовы P/Invokes для API pjsip, что делает необходимым вызывать pj_thread_register() перед каждым вызовом любой из API-интерфейсов pjsip, чтобы быть уверенным, что вновь созданный поток ThreadPool не будет пытаться использовать какой-либо API-интерфейс pjsip до регистрации.

Я подумал, что если бы я мог быть уведомлен (с обратным вызовом, который вызывается в контексте вновь созданного потока) всякий раз, когда создается новый поток пула потоков, я мог бы использовать этот обратный вызов для регистрации нового потока только один раз. Есть ли способ получить такое уведомление?

В качестве альтернативы я мог бы использовать SynchronizationContext (например, Асинкконтекст Стивена Клири или асинхронный насос Стивена Туба) в основном или в некоторых выделенных потоках (и зарегистрировать их, как только я их создам), но это будет означать перепроектирование приложения, возможно, в сторону актеров модель, есть ли альтернативный подход к таким ситуациям?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Можно использовать API-интерфейсы профилирования или ETW для обнаружения всех событий создания пула потоков. Однако я не уверен, насколько легко будет выполнить код в контексте этого потока в результате этих событий.

Я бы рекомендовал использовать поле [ThreadStatic] static bool PjInitialized; на вашем уровне взаимодействия и добавлять проверку к каждому вызову на этом уровне. Если он не инициализирован, вызовите pj_thread_register перед фактическим вызовом.

Другие вопросы по теме