.net - 是否有 timeBeginPeriod 和 timeEndPeriod 方法的 .NET 替代品?

标签 .net serial-port delphi-prism oxygene winmm

我一直在开发一个在串行端口上通信的程序,但遇到了问题。它的通信率低于 50% 或更少。如果没有,大多数情况下都会超时。

根据我对这个问题的研究,我发现默认情况下全局或系统计时器分辨率至少为 10 毫秒或更大。

Serial Communication (RTS) and Windows 7

因此,如果您在通信中使用 Thread.Sleep 暂停 X 毫秒,那么它最多可以执行 10 毫秒或更长的时间来进行无操作或暂停。

就我而言,这对于我的程序与外部设备通信来说太长了。设备收到我的程序的请求后会在 10 毫秒内回复。如果我的程序还没有准备好接收返回的答案,那么我的程序将会超时。

解决此问题的唯一方法是调整或更改系统计时器分辨率。为此,我被告知使用 winmm.dll 中的 Windows 方法 timeBeginPeriod 和 timeEndPeriod。虽然我可以为我的程序的 Windows .NET 版本导入这些方法,但我想知道 .NET 框架中是否有这些方法的替代品。

最佳答案

如果您的目标是避免调用特定于平台的 DLL 函数并仅使用 .Net 框架,那么对于短超时,使用 System.Diagnostics.Stopwatch 循环可能是您的最佳选择。

秒表将自动使用高分辨率计时器(如果存在)。

public static void Pause(long ms) 
{
    Stopwatch t = new Stopwatch();
    t.Start();
    while(t.ElapsedMilliseconds < ms) { }
    t.Stop();
}

这将阻止您的调用线程并在暂停循环中占用 CPU,以缓解其中的一些问题(如果您使用的是多核系统,您可以将进程或线程的亲和性设置为另一个核心。How Can I Set Processor Affinity in .NET?

关于.net - 是否有 timeBeginPeriod 和 timeEndPeriod 方法的 .NET 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13234420/

相关文章:

c# - 如何从 C# 项目中调用另一个进程?

.net - System.Windows.Point 和 System.Drawing.Point 命名空间有什么区别?

delphi - 为什么 Delphi Prism 提示系统类型不匹配?

c# - 将 IEnumerable 转换为 EntitySet

c# - 将 .NET XMLWriter 与 XSD 结合使用

c# - 如何获取请求的默认文档?

c# - 获取 (400) 错误请求。尝试发送 GCM 消息时

c# - serialport.Write() - 如何正确格式化字节

mono - 如何在单声道下强制应用程序的单实例?

python - 如何从串口读取数据? Python