C# 从不同线程读取Stopwatch.ElapsedMilliseconds会给出正确的值吗?

C# 从不同线程读取Stopwatch.ElapsedMilliseconds会给出正确的值吗?,c#,multithreading,stopwatch,C#,Multithreading,Stopwatch,我已启动的实例,并希望从另一个线程读取它的ElapsedMilliseconds: var diff = myStopwatch.ElapsedMilliseconds - someOtherValue; 然而,我已经读过编译器优化代码,假设它运行在同一个线程上,这可能导致上面这行从注册表读取一个值,而不是在执行它的精确时间点获得实际值。这会影响我吗?如果是这样的话,我该如何解决它呢?秒表pinvokes的优化不会以任何方式影响它。winapi函数依赖于硬件抽象层HAL来提供计数器源。最典型的

我已启动的实例,并希望从另一个线程读取它的ElapsedMilliseconds:

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;
然而,我已经读过编译器优化代码,假设它运行在同一个线程上,这可能导致上面这行从注册表读取一个值,而不是在执行它的精确时间点获得实际值。这会影响我吗?如果是这样的话,我该如何解决它呢?

秒表pinvokes的优化不会以任何方式影响它。winapi函数依赖于硬件抽象层HAL来提供计数器源。最典型的是芯片组中可用的计数器。不同的机器使用不同的芯片组,原因是秒表的频率特性是暴露出来的。因此,不同的HAL实现无法保证主板没有cooties。Microsoft在MSDN文章中的注释涵盖了该责任:

在多处理器计算机上,调用哪个处理器并不重要。但是,由于基本输入/输出系统(BIOS)或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的结果。要为线程指定处理器亲缘关系,请使用SetThreadAffinityMask函数

这种虫子在20年前并不完全罕见,在今天是闻所未闻的