相关疑难解决方法(0)

如何确保时间戳始终是唯一的?

我正在使用时间戳来临时命令我的程序中的并发更改,并要求更改的每个时间戳都是唯一的.但是,我发现简单地调用DateTime.Now是不够的,因为如果快速连续调用,它通常会返回相同的值.

我有一些想法,但没有任何事情让我觉得这是"最好的"解决方案.有没有一种方法可以保证每次连续调用都能产生一个独特的DateTime

我应该为此使用不同的类型,也许是长整数?DateTime具有明显的优势,可以像实时一样轻松解释,不像增量计数器.

更新:这是我最终编写的一个简单的折衷解决方案,它仍然允许我DateTime用作我的临时密钥,同时在每次调用方法时确保唯一性:

private static long _lastTime; // records the 64-bit tick value of the last time
private static object _timeLock = new object();

internal static DateTime GetCurrentTime() {
    lock ( _timeLock ) { // prevent concurrent access to ensure uniqueness
        DateTime result = DateTime.UtcNow;
        if ( result.Ticks <= _lastTime )
            result = new DateTime( _lastTime + 1 );
        _lastTime = result.Ticks;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为每个滴答值只有一千万分之一秒,所以这种方法在每秒调用1000万次时会引入明显的时钟偏差(顺便说一句,它的执行效率足够高),这意味着它是完全可以接受我的目的.

这是一些测试代码:

DateTime start …
Run Code Online (Sandbox Code Playgroud)

.net c# concurrency datetime

30
推荐指数
3
解决办法
2万
查看次数

标签 统计

.net ×1

c# ×1

concurrency ×1

datetime ×1