我们有一个应用程序可以为我们的一项服务生成模拟数据以进行测试。每个数据项都有一个唯一的 Guid。但是,当我们在对模拟器进行一些小的代码更改后运行测试时,它生成的所有对象都具有相同的 Guid。
创建了一个数据对象,然后是一个 for 循环,其中对象的属性被修改,包括一个新的唯一 Guid,并通过远程处理(可序列化,而不是 marshal-by-ref,如果这是你的话)发送到服务'正在考虑),循环并再次执行,等等。
如果我们在循环中放置一个小的 Thread.Sleep( ...),它会生成唯一的 id。我认为这是一个红鲱鱼。我创建了一个测试应用程序,它只是一个接一个地创建了一个 guid,并且没有得到一个副本。
我的理论是,IL 的优化方式导致了这种行为。但是关于我的理论就足够了。你怎么看?我愿意接受建议和测试它的方法。
更新:我的问题似乎有很多困惑,所以让我澄清一下。我不认为 NewGuid() 坏了。显然它有效。没关系!但是在某处有一个错误,导致 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
}