CLR内部产生一个线程来响应计时器事件吗?

时间:2011-06-14 12:51:39

标签: .net clr sscli

Hans和我最近就这个问题进行了一些小讨论,我很好奇它是如何实现的。

请参阅此处的评论中的初步说话:Are c# timers naturally multithreaded?

2 个答案:

答案 0 :(得分:2)

盯着.Net 4.0参考源,System.Timers.Timer似乎使用System.Threading.Timer来处理实际的实现细节。后者通过调用AddTimerNative生成计时器。 AddTimerNative是内部电话。

Google搜索AddTimerNative会带来很多有趣的结果,包括Willy Denoyette的评论,其中他声称它会调用CreateTimerQueueTimer

该页面指出“回调函数排队到线程池。”

答案 1 :(得分:2)

好吧,我做了一些调查......详细信息在我的blog post

简而言之,只是从那里总结:

  • 至于SSCLI20,汉斯是完全正确的。处理APC和排队计时器的确有单独的线程。谢谢你的坚持,顺便说一下。我有机会挖掘一些有趣的东西:)
  • 在较新的系统上,它仍然可以在没有额外线程的情况下实现。当我写CLR 2.0时,我只是错误地认为它已经存在了。有关详细信息,请参阅CreateThreadpoolTimer,SetThreadpoolTimer和CloseThreadpoolTimer。