C# NET:如何尽可能精确地获取按键时间?

C# NET:如何尽可能精确地获取按键时间?,c#,xna,keyboard,keyboard-events,low-latency,C#,Xna,Keyboard,Keyboard Events,Low Latency,我正在尝试构建一个应用程序,除了键盘按下(或外部控制器按钮按下)的时间戳之外,它通常不必具有超级性能。我希望时间戳尽可能精确,最好降到+/-5毫秒。这是为了科学应用。以最小的延迟实现这一点的最佳编程范例是什么?以下哪项更可取 (a) 创建以更高优先级运行的工作线程,并循环查看是否按下了某个键。如果x小于5,则使用Sleep(x) (b) 创建具有异步回调的键盘挂钩 (c) 另一种选择 除了答案之外,任何代码(或示例链接)都将非常感谢,因为我是一个相当新的开发人员 编辑:命名法。应该更加小心。所谓

我正在尝试构建一个应用程序,除了键盘按下(或外部控制器按钮按下)的时间戳之外,它通常不必具有超级性能。我希望时间戳尽可能精确,最好降到+/-5毫秒。这是为了科学应用。以最小的延迟实现这一点的最佳编程范例是什么?以下哪项更可取

(a) 创建以更高优先级运行的工作线程,并循环查看是否按下了某个键。如果
x
小于5,则使用
Sleep(x)

(b) 创建具有异步回调的键盘挂钩

(c) 另一种选择

除了答案之外,任何代码(或示例链接)都将非常感谢,因为我是一个相当新的开发人员


编辑:命名法。应该更加小心。所谓时间戳,我指的是一般的时间,不一定是全天、月、年、时、分、秒、毫秒。我从一开始就计划使用StopWatch类,因为我所需要的只是程序中事件开始和按钮按下之间的时间。如果不清楚,很抱歉。

如果您要查找按键的确切时间戳,DateTime可能不是您想要使用的:

DateTime的精度很高,但在性能方面相当粗糙 精确一般来说,你不能。通常是系统时钟 (DateTime.Now从中获取数据)的分辨率为 大约10-15毫秒。请参阅Eric Lippert关于精度和可靠性的博客文章 更详细的信息,请准确

如果您需要比这更准确的计时,您可能需要查看 使用NTP客户端

以及该帖子中引用的链接:

现在,问题是“从开始到结束花了多少时间?” 与“现在几点?”完全不同的问题,如果 你想问的问题是手术需要多长时间, 你想要一个高精度,高精度的答案,然后使用
秒表
类。它确实具有纳秒级的精度和准确度 这接近其精度

记住,你不需要知道现在是什么时间就知道有多少时间 已经过去了。这可能是两件完全不同的事情

从评论中:


我在寻找活动开始和按键之间的区别

重要的是要理解,这与试图获取按键的实际时间戳是非常不同的

这种情况正是秒表的用途。是的,使用它,并感谢您没有真正尝试获取时间戳


只要在事件开始时使用
Stopwatch.StartNew
,在按键事件时使用
Stopwatch.Stop
。事件处理程序触发的延迟很小,但与其他任何东西相比,这都是很小的-如果它在这里给您带来任何问题,我会感到惊讶。

您是在寻找真正的时间戳(时间点),还是仅仅是按键之间的时间?我在寻找事件开始和按键之间的差异。我打算上秒表课。不确定这是否是推荐的。这本书已经很好地介绍过了。我很怀疑秒表是否能为你做些什么,如果它能做的话,你就没有很好地解释你的要求。我本来打算用秒表的。哪种范式最适合使用秒表?你所说的“范式”是什么意思?这是一个不错的使用秒表类的基本介绍:我想我指的是同步或异步模式,(a)或(b),或者我没有想到的第三个选项。所以你认为使用事件处理程序而不是使用同步模式是明智的吗?@Doug:是的-我自己没有使用过XNA,但我希望它像大多数UI一样基于事件。@Doug不确定,但我认为说“事件处理程序,而不是同步模式”是不对的。事件是同步的,除非您特意使它们异步。