我有以下代码。 在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;
}
}
最佳答案
锁定是完全没有必要的;问题是 DateTime.Now
只有 ~15ms 左右的粒度(取决于您的系统)。首先不要使用时间作为 id;你可以很容易地做这样的事情:
public static class Util
{
static long _id;
public static string GetId()
{
return Next().ToString("0000000000000000");
}
private static long Next()
{
return Interlocked.Increment(ref _id);
}
}
关于c# Lock with Thread.Sleep 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751930/