Есть ли способ получать уведомления (например, через событие или обратный вызов) всякий раз, когда создается новый поток 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 (например, Асинкконтекст Стивена Клири или асинхронный насос Стивена Туба) в основном или в некоторых выделенных потоках (и зарегистрировать их, как только я их создам), но это будет означать перепроектирование приложения, возможно, в сторону актеров модель, есть ли альтернативный подход к таким ситуациям?





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