我们有一个应用程序用于生成模拟数据以测试我们的服务。每个数据项都有一个唯一的Guid。但是当我们在模拟器中进行了一些小的代码更改后运行测试时,它生成的所有对象都具有相同的Guid。
首先创建一个数据对象,然后在for循环中修改对象的属性(包括新的唯一Guid)并通过远程调用 (序列化的方式,而不是引用传递) 将其发送到服务端。之后继续循环并重复上述过程。
如果我们在循环内部加入短暂的Thread.Sleep(...)语句,它就会生成唯一的id。但我认为这只是一个红鲱鱼。我创建了一个测试应用程序来连续创建Guid,没有出现重复。
我的理论是IL以某种方式进行了优化,导致了这种行为。但是足够谈论我的理论了,您认为呢?我对建议和测试方法持开放态度。
更新:有很多人对我的问题感到困惑,所以让我澄清一下。我不认为NewGuid()有问题。显然它是有效的。它没问题!但是,这里有一个Bug,导致NewGuid()要么: 1. 在我的循环中只被调用一次 2. 在我的循环中每次都被调用,但只被分配一次 3. 我还没有想到的其他情况
这个Bug可能在我的代码中(最有可能的)或者是优化中。
所以,再次重申我的问题:我应该如何调试这种情况?
(谢谢大家的讨论,这确实帮助我在脑海中澄清了问题)
更新2:我很想发布一个显示问题的示例,但这也是我的问题之一。我无法在整个应用程序套件(客户端和服务器)之外复制它。
以下是相关片段:
首先创建一个数据对象,然后在for循环中修改对象的属性(包括新的唯一Guid)并通过远程调用 (序列化的方式,而不是引用传递) 将其发送到服务端。之后继续循环并重复上述过程。
如果我们在循环内部加入短暂的Thread.Sleep(...)语句,它就会生成唯一的id。但我认为这只是一个红鲱鱼。我创建了一个测试应用程序来连续创建Guid,没有出现重复。
我的理论是IL以某种方式进行了优化,导致了这种行为。但是足够谈论我的理论了,您认为呢?我对建议和测试方法持开放态度。
更新:有很多人对我的问题感到困惑,所以让我澄清一下。我不认为NewGuid()有问题。显然它是有效的。它没问题!但是,这里有一个Bug,导致NewGuid()要么: 1. 在我的循环中只被调用一次 2. 在我的循环中每次都被调用,但只被分配一次 3. 我还没有想到的其他情况
这个Bug可能在我的代码中(最有可能的)或者是优化中。
所以,再次重申我的问题:我应该如何调试这种情况?
(谢谢大家的讨论,这确实帮助我在脑海中澄清了问题)
更新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
}