c# Lock with Thread.Sleep 不工作

标签 c# datetime locking time-measurement

我有以下代码。 在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/

相关文章:

java - 在java中将EST时间转换为本地时间

C# Unix 时间戳到 DateTime

c++ - 使用 <ctime> 生成日期 vector

c++ - 寻找对我的读者/作家实现的批评

c# - 使用继承向内置类添加函数

c# - 来自 ASP.NET MVC 后端的 Javascript 客户端延迟加载模型

数据库:是否有供应商支持列级锁定?

php - 如何在 Windows 上的 PHP 中锁定目录以进行独占访问?

javascript - 或者 JavaScript 中的声明?

c# - HttpWebRequest 没有关闭方法?