Is there a way to be notified (e.g. via an event or a callback) whenever a new ThreadPool thread is created?
I'm working on a .net console app that is using pjlib library via P/Invoke. This library requires that every thread that uses any of its APIs has to be previously registered via pj_thread_register API:

将外部或本机API创建的线程注册到PJLIB.必须在注册线程的上下文中调用此函数.当通过外部函数或API调用创建线程时,必须使用pj_thread_register()将其"注册"到PJLIB,以便与PJLIB的框架协作.在注册期间,需要维护一些数据,并且这些数据必须在线程的生命周期内保持可用.

当试图从未注册的线程调用任何pjlib函数时,该库确实会断言以下消息:

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

现在,应用程序的业务逻辑使用asyncawait,作为一个控制台应用程序,SynchronizationContext为null,这意味着所有continuations都将在ThreadPool的线程上运行,包括对pjsip API的P/Invokes调用,这就需要在每次调用任何pjsip API之前调用pj_thread_register(),确保新创建的线程池的线程在注册自己之前不会try 使用任何pjsip API.

我想,如果每当创建新线程池线程时,我都能收到通知(通过在新创建的线程上下文中调用的回调),我就可以使用这个回调只注册一次新线程.

或者,我可以在主线程或一些专用线程上使用SynchronizationContext(例如Stephen Cleary的AsyncContext或Stephen Toub的AsyncPump)(并在创建线程后立即注册),但这意味着要重新设计应用程序,可能要采用演员模型,有没有其他方法来应对这种情况?

推荐答案

可以使用分析API或ETW来检测所有线程池创建事件.不过,我不确定这些事件会让你轻松地获得execute code in the context of that thread分.

我建议在互操作层中使用[ThreadStatic] static bool PjInitialized;字段,并在该层的每个调用中添加一个判断.如果未初始化,则在实际调用之前调用pj_thread_register.

Csharp相关问答推荐

C#自定义字典与JSON(de—)serialize

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

EF Core在请求列表时忽略列,但在按ID获取时包含

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

`Task`只有在C#中等待时才会运行吗?

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

C#.NET依赖项注入顺序澄清

与C#中的Zip列表并行

如何将不同类型的扩展参数的javascript函数转换成C#风格?

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

WinForms在Linux上的JetBrains Rider中的应用

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

使用动态键从请求体反序列化JSON

用于获取字符串的最后12个字符的正则表达式(空格除外)

我是否应该注销全局异常处理程序

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

C#中的逻辑运算符用作单词';is';and';and';

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值

SendInput无法在C#中正确模拟键盘

ASP.NET文件上传不接受超过10MB的文件