【发布时间】:2023-04-06 23:28:02
【问题描述】:
我有以下代码。 在 windows server 2008 中,该程序是正确的并且可以按预期运行。它输出 10 个不同的 id。
但是,当我在 windows server 2003 中运行它时,程序不正确。它输出 10 个 id,但其中一些 id 是重复的。锁好像坏了。
如果我设置Thread.Sleep(500),它在windows server 2003 上可以正常工作。
class Test
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Util.GetId());
}
Console.ReadLine();
}
}
public class Util
{
private static object idlock = new object();
public static string GetId()
{
string id = "";
lock (idlock)
{
Thread.Sleep(1);
id = System.DateTime.Now.ToString("yyMMddHHmmssffff");
}
return id;
}
}
【问题讨论】:
-
我认为问题在于:Windows 不是实时操作系统,因此您不会从 Thread.Sleep(1) 获得每秒 1000 次唤醒。如果您没有使用 timeBeginPeriod 设置最小分辨率,您将大约每 15 毫秒唤醒一次。即使您将最小分辨率设置为 1 毫秒,您仍然只会每 3-4 毫秒唤醒一次。为了获得毫秒级计时器粒度,您必须使用 Win32 多媒体计时器(C# 包装器)。
-
现在,我已将睡眠时间设置为 15,当应用程序在 windows 2003 中运行时问题已解决。但在 windows 2008 中仍然可以正常运行。感谢您的所有回复!
标签: c# datetime locking time-measurement