Tenemos una aplicación que genera datos simulados para uno de nuestros servicios con fines de prueba. Cada elemento de datos tiene un Guid único. Sin embargo, cuando ejecutamos una prueba después de algunos cambios de código menores en el simulador, todos los objetos generados por él tenían la misma Guid.Duplicado devuelto por Guid.NewGuid()?
Se creó un único objeto de datos, luego un bucle for donde se modificaron las propiedades del objeto, incluido un nuevo Guid único, y se envió al servicio mediante comunicación remota (serializable, no marshal-by-ref, si eso es lo que estás pensando), haz un bucle y hazlo de nuevo, etc.
Si ponemos un pequeño Thread.Sleep (...) dentro del bucle, generó id únicos. Sin embargo, creo que es un acertijo. Creé una aplicación de prueba que acaba de crear un guid tras otro y no obtuvo un solo duplicado.
Mi teoría es que el IL fue optimizado de una manera que causó este comportamiento. Pero lo suficiente sobre mis teorías. ¿Qué piensas? Estoy abierto a sugerencias y formas de probarlo.
ACTUALIZACIÓN: Parece haber mucha confusión acerca de mi pregunta, así que déjenme aclarar. NO creo que NewGuid() esté roto. Claramente funciona ¡Está bien! Sin embargo, hay un error en alguna parte, que hace que NewGuid(): 1) se invoque solo una vez en mi ciclo 2) se llame cada vez en mi ciclo pero se me asigna una sola vez 3) algo más que no he pensado
Este error puede estar en mi código (MÁS probable) o en algún lugar de optimización.
Para reiterar mi pregunta, ¿cómo debo depurar este escenario?
(y gracias por la gran discusión, esto es realmente ayudar a aclarar el problema en mi mente)
ACTUALIZACIÓN # 2: Me gustaría poder escribir un ejemplo que muestra el problema, pero eso es parte de mi problema. No puedo duplicarlo fuera de todo el conjunto de aplicaciones (cliente y servidores).
He aquí un fragmento relevante sin embargo:
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
}
Si cree que hay un error en la IL, use Reflector para rastrearlo. –
Ah, sí. Pensé en eso. Pero mi suposición inicial fue que probablemente estaría en el optimizador JIT. No se puede usar Reflector para eso. – dviljoen
Si no crees que sea un error de NewGuid, publica un código que muestre el problema.O, al menos, publique el código que * tuvo * el problema. Además, responda la pregunta de si eliminar Thread.Sleep hace que el problema vuelva a aparecer. Soy bastante bueno en depuración psíquica, pero aún mejor con algunos detalles. –