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

只创建了一个数据对象,然后创建了一个for循环,其中修改了对象的属性,包括一个新的唯一Guid,并通过远程处理(可序列化,如果您正在考虑的话,不是按引用封送)、循环并再次执行等方式将其发送到服务。

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

我的理论是,IL是以某种方式进行优化的,从而导致了这种行为。但我的理论说得够多了。你认为如何?我对测试它的建议和方法持开放态度。

更新:我的问题似乎有很多困惑,所以让我来澄清一下。我不认为NewGuid()是坏的。显然,它是有效的。很好!然而,有一个bug导致NewGuid()要么: 1)在我的循环中只被调用一次2)在我的循环中每次都被调用,但只被赋值一次3)其他我没有想到的事情

这个bug可能出现在我的代码中(最有可能的),也可能出现在优化中。

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

(感谢你的精彩讨论,这真的帮助我弄清楚了我脑海中的问题)

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

不过,下面是相关的代码片段:

代码语言:javascript复制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

}