.NET垃圾收集器';s停止世界效果停止或延迟非托管线程和计时器回调的执行?

.NET垃圾收集器';s停止世界效果停止或延迟非托管线程和计时器回调的执行?,.net,garbage-collection,interop,scheduling,.net,Garbage Collection,Interop,Scheduling,我有一个应用程序需要以非常精确的间隔执行代码。为此,我还需要通过timeBeginPeriod将Windows的调度程序分辨率提高到1ms 这样,我有一个本地C++ DLL,它通过从1*ms(所有本机代码)的间隔从代码< TimeQuealeTeaEng/中得到的回调来处理所有关键时间的事情。 应用程序本身是一个.NET应用程序(C#,所以是纯CLR)。本机dll使用缓冲,因此只要C#代码每隔50毫秒左右获得一段执行时间,它本身就不需要对时间要求很高 当垃圾收集器触发时,这是否也会停止或延迟程序

我有一个应用程序需要以非常精确的间隔执行代码。为此,我还需要通过
timeBeginPeriod
将Windows的调度程序分辨率提高到1ms

这样,我有一个本地C++ DLL,它通过从1*ms(所有本机代码)的间隔从代码< TimeQuealeTeaEng/<代码>中得到的回调来处理所有关键时间的事情。 应用程序本身是一个.NET应用程序(C#,所以是纯CLR)。本机dll使用缓冲,因此只要C#代码每隔50毫秒左右获得一段执行时间,它本身就不需要对时间要求很高

当垃圾收集器触发时,这是否也会停止或延迟程序中任何计时器回调的执行?(换句话说,.NET程序的不确定性是否会蔓延到它使用的本机代码片段?)我还没有找到这个精确问题的答案。链接到MSDN文档将是最令人放心的


我使用的是.NET 4.0,直觉告诉我不是-CLR只会影响托管线程

  • CLR不需要停止非托管线程来收集垃圾
  • CLR不应该知道进程中的非CLR线程:这将违反隔离。想象一下IIS服务器或SQL服务器——两者都承载CLR,但我无法想象CLR会冻结进程中的所有线程。。。即使用户的托管代码(存储的proc/web应用程序)使用WIN32 API函数来尝试和操作进程中的非托管线程,托管的托管代码甚至不应该具有操作主机的非CLR线程所需的安全权限(对于Windows,CLR是“另一个COM对象”)
  • 我找不到MSDN确认,但您可以尝试证明非托管线程正在垃圾收集期间运行:让非托管线程不断跟踪,并进行跟踪。请确保托管线程的跟踪在垃圾收集过程中继续


    (同样值得注意的是,有几种行为方式不同)

    您使用的是哪个版本的.NET?GC在4.5中发生了变化,它可能会帮助您解决问题()。@dialer您有什么经验?在托管环境中运行非托管线程时是否存在性能问题?谢谢:)我想这是正确的(无论如何我希望如此),因为AndyBrown评论中的文档说“运行本机代码的线程不受影响”。但是,我的计时器回调在线程池线程上运行,并且在任何两个回调之间还没有选择该线程。我不确定在GC操作期间是否可以恢复所有挂起的线程池线程(考虑到还有托管线程池线程?)