gpt4 book ai didi

c# - Guid.NewGuid() 返回重复项?

转载 作者:可可西里 更新时间:2023-11-01 08:51:47 49 4
gpt4 key购买 nike

我们有一个应用程序可以为我们的一项服务生成模拟数据以用于测试目的。每个数据项都有一个唯一的 Guid。然而,当我们在对模拟器进行一些小的代码更改后运行测试时,它生成的所有对象都具有相同的 Guid。

创建了一个数据对象,然后是一个 for 循环,其中修改了对象的属性,包括一个新的唯一 Guid,并通过远程处理将其发送到服务(可序列化,而不是按引用编码,如果这就是你的想法),循环并再次执行,等等。

如果我们在循环中放置一个小的 Thread.Sleep( ...) ,它会生成唯一的 ID。我认为这是一个转移注意力的问题。我创建了一个测试应用程序,它只是一个接一个地创建了一个 guid,但没有得到一个副本。

我的理论是 IL 以导致此行为的方式进行了优化。但是关于我的理论已经足够了。你怎么看?我乐于接受建议和测试方法。

更新:我的问题似乎有很多困惑,所以让我澄清一下。我不认为 N​​ewGuid() 坏了。显然它有效。没关系!但是某处有一个错误,导致 NewGuid() 要么:1)在我的循环中只被调用一次2)在我的循环中每次都被调用但只分配一次3) 其他我没想到的

这个错误可能在我的代码中(最有可能)或在某处的优化中。

所以重申我的问题,我应该如何调试这个场景?

(感谢大家的精彩讨论,这真的帮助我理清了心中的问题)

更新 # 2:我很乐意发布一个显示问题的示例,但这是我的问题的一部分。我无法在整个应用程序套件(客户端和服务器)之外复制它。

这里有一个相关的片段:

OrderTicket ticket = new OrderTicket(... );

for( int i = 0; i < _numOrders; i++ )
{
ticket.CacheId = Guid.NewGuid();
Submit( ticket ); // note that this simply makes a remoting call
}

最佳答案

提交是否执行异步调用,或者票证对象是否在任何阶段进入另一个线程。

在代码示例中,您重复使用了同一个对象。如果 Submit 在短暂延迟后在后台线程中发送票证(并且不获取副本)怎么办?当您更改 CacheId 时,您实际上是在更新所有待处理的提交。这也解释了为什么 Thread.Sleep 解决了这个问题。试试这个:

for( int i = 0; i < _numOrders; i++ )
{
OrderTicket ticket = new OrderTicket(... );
ticket.CacheId = Guid.NewGuid();
Submit( ticket ); // note that this simply makes a remoting call
}

如果出于某种原因这是不可能的,试试这个,看看它们是否仍然相同:

ticket.CacheId = new Guid("00000000-0000-0000-0000-" + 
string.Format("{0:000000000000}", i));

关于c# - Guid.NewGuid() 返回重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/300786/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com