2011-05-10 108 views
2

我对线程没有太多的经验。我正在使用.NET 4,并希望使用.NET 4线程功能来解决这个问题。这是我想要做的。通过一定间隔的时间间隔通过线程执行任务

我有两种方法'A'和'B'。我希望'A'每几毫秒(如3000)每次调用'B'几次(如100)。我想记录方法'B'在完成100次(或其他)时的平均执行时间。为了计算平均值,该类将有一些私有属性来跟踪'B'的总执行时间。

我不知道方法'A'是否应该通过System.Timers.Timer线程(其中间隔可以设置,但不是次数)调用'B',或者如果有更好的(。 NET 4)这样做的方式。

非常感谢。

+0

这不像一个评论的答案,但这是一个关于多线程和在.NET 4中使用定时器的非常好的文章:http://www.albahari.com/threading/part3。 aspx – IAmTimCorey 2011-05-10 15:37:24

+1

伟大的文章 - 我以前引用过它。 – 2011-05-10 15:58:13

回答

3

在阅读您的问题时,我认为您的根本问题是安全地启动一组事件并以线程安全的方式计时它们的执行。在你的例子中,你每3000毫秒运行100次迭代。这意味着至多每次迭代只需要30ms。不幸的是,System.Timers.Timer(System.Threading.Timer与它的包装器)并不那么精确。最好预计精度为10ms,可能会更糟。为了获得真正需要的1ms精度,您将需要使用本机互操作。以下是我在此发现的报价:

多线程定时器的精度取决于操作系统,通常位于10-20 ms区域中。如果您需要更高的精度,则可以使用本机互操作并调用Windows多媒体计时器。这精度低至1毫秒,它在winmm.dll中定义。首先调用timeBeginPeriod来通知操作系统您需要较高的定时精度,然后调用timeSetEvent启动多媒体定时器。完成后,调用timeKillEvent来停止定时器和timeEndPeriod,以通知操作系统您不再需要高定时精度。您可以通过搜索关键字使用的多媒体计时器在互联网上完整的例子dllimport的WINMM.DLL的timeSetEvent

-Joseph阿尔巴哈利(http://www.albahari.com/threading/part3.aspx

如果你听从他的建议,你应该得到的精度你需要。

+0

这可能是矫枉过正 - 我没有看到来自OP的关于极端准确性的非常具体的声明 - 为什么不使用Timer类来处理间隔并计算静态变量中出现次数和流逝次数,一旦出现计数达到所需的N?我的印象是,OP正在寻找确认这是最好的.Net类在这里使用,它是。 – 2011-05-10 17:33:22