在创建新的ThreadPool线程时,是否有一种通知方式(例如,通过事件或回调)?
我正在开发一个.net控制台应用程序,它通过P/Invoke使用pjlib库。这个库要求使用其任何API的每个线程都必须事先通过寄存器 API注册:
将外部或本机API创建的线程注册到PJLIB。必须在正在注册的线程的上下文中调用此函数。当通过外部函数或API调用创建线程时,必须使用pj_thread_register()将其“注册”到PJLIB,以便它能够与PJLIB的框架协作。在注册期间,需要维护一些数据,并且这些数据必须在线程的生存期内保持可用。
当试图调用任何pjlib函数形成一个未注册的线程时,库将使用以下消息进行断言:
从未知/外部线程调用pjlib。你必须 使用pj_thread_register()注册外部线程 在调用任何pjlib函数之前。
现在,应用程序的业务逻辑使用async
和await
,并且作为控制台应用程序,SynchronizationContext是空的,这意味着所有的延续都将在ThreadPool的线程上运行,包括P/调用对pjsip API的调用,这使得在每次调用任何pjsip API之前都必须调用pj_thread_register()
,以确保新创建的ThreadPool线程在注册之前不会尝试使用任何pjsip API。
我认为,如果每当创建了新线程池线程时,都可以通知我(使用在新创建的线程上下文中调用的回调),那么我可以使用这个回调注册新线程一次。是否有办法收到这样的通知?
或者,我可以在主线程或一些专用线程上使用SynchronizationContext (例如,Stephen的AsyncContext或Stephen的AsyncPump) (并在创建它们之后立即注册它们),但这意味着重新设计应用程序,可能会转向演员模型,是否有其他方法来应对这种情况?
发布于 2022-05-16 06:38:43
可以使用分析API或ETW来检测所有线程池创建事件。不过,我不确定在该线程的上下文中执行代码是否会因为这些事件而变得容易。
我建议在互操作层中使用[ThreadStatic] static bool PjInitialized;
字段,并在该层的每个调用中添加一个检查。如果未初始化,则在实际调用之前调用pj_thread_register
。
https://stackoverflow.com/questions/72260838
复制