7

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

为此,我有一个本机 C++ dll,它通过TimerQueueTimer以 1ms 的间隔从 a 引发的回调处理所有时间关键的事情(所有本机代码)。

应用程序本身是一个 .NET 应用程序(C#,所以纯 CLR)。本机 dll 使用缓冲,因此 C# 代码本身不需要时间关键,只要它每 50 毫秒左右获得一些执行时间。

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

我正在使用 .NET 4.0

4

1 回答 1

3

我的直觉说不——CLR 只会影响托管线程。

  1. CLR 不需要停止非托管线程来收集垃圾。
  2. CLR 不应该知道进程中的非 CLR 线程:它会违反隔离。想想 IIS 服务器或 SQL 服务器 - 都承载 CLR,但我无法想象 CLR 会冻结进程中的所有线程......即使用户的托管代码使用 WIN32 API 函数(存储过程 / web 应用程序)尝试和操作进程中的非托管线程,托管的托管代码甚至不应该具有操作主机的非 CLR 线程所需的安全权限(对于 Windows,CLR 是“另一个 COM 对象”) .

我找不到 MSDN 确认,但你可以尝试证明在垃圾收集期间有一个非托管线程正在运行:有一个非托管线程不断跟踪,并有一个GC 通知机制跟踪。看到托管线程的跟踪在垃圾收集过程中继续进行。

(另外值得注意的是,有几种GC“模式”,它们的行为不同)

于 2013-05-20T20:37:26.917 回答