small - initialize guid c#
Duplicado devuelto por Guid.NewGuid()? (7)
Es un error en tu código. Si ha logrado generar múltiples guid es la explicación más probable. La clave está aquí en su pregunta: "cuando realizamos una prueba después de algunos cambios menores en el código del simulador, todos los objetos generados por él tenían el mismo Guid"
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.
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 por comunicación remota (serializable, no mariscal por ref, si eso es lo que está pensando), repite 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 sobre 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) sea llamado solo una vez en mi ciclo 2) sea llamado cada vez en mi ciclo pero asignado solo una vez 3) algo más en lo que no haya pensado
Este error puede estar en mi código (MÁS probable) o en optimización en alguna parte.
Entonces, para reiterar mi pregunta, ¿cómo debo depurar este escenario?
(y gracias por la gran discusión, esto realmente me está ayudando a aclarar el problema en mi mente)
ACTUALIZACIÓN # 2: me encantaría publicar un ejemplo que muestre el problema, pero eso es parte de mi problema. No puedo duplicarlo fuera de todo el conjunto de aplicaciones (cliente y servidores).
Aquí hay un fragmento relevante:
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
}
No conozco los detalles de cómo se generan los GUID ... todavía. Sin embargo, actualmente mi org. está criando GUID a un ritmo que avergonzaría a los conejos. Así que puedo responder por el hecho de que los GUID no están rotos ... todavía .
- Publique el código fuente si es posible ... o una aplicación de reproducción de clones. Muchas veces creo que el acto de crear esa aplicación de clonación para reproducir el problema me muestra el problema.
- El otro enfoque sería comentar "esos pequeños cambios". Si eso soluciona el problema, puede triangularizar para encontrar la línea ofensiva de código. Eye-ball el menor cambia drásticamente ... quiero decir real Duro.
Háganos saber cómo va ... esto suena interesante.
El código en Submit y OrderTicket sería útil también ...
Está reutilizando OrderTicket. Sospecho que usted (o remoting) está llamando por lotes, probablemente con respecto a # de conexiones / límites de host, y recogiendo el último valor de CacheId cuando finalmente los envía.
Si depura o Thread.Sleep la aplicación, está cambiando el tiempo para que la llamada remota finalice antes de asignar un nuevo CacheId.
¿Estás sincronizando la llamada remota? Pensaría que una llamada de sincronización bloquearía, pero lo verificaría con un analizador de paquetes como Wireshark para estar seguro. A pesar de todo, simplemente cambiar para crear un nuevo OrderTicket en cada iteración probablemente sea el truco.
Editar: La pregunta no es sobre la ruptura de NewGuid ... entonces mi respuesta anterior ha sido eliminada.
Mi instinto me dice que algo así sigue ...
class OrderTicket
{
Guid CacheId {set {_guid = new Guid("00000000-0000-0000-0000-");}
}
Registre el valor de CacheId en un archivo de registro cada vez que se invoque con un seguimiento de pila ... Tal vez alguien más lo esté configurando.
Realiza una llamada asincrónica, o el objeto de ticket entra en otro hilo en cualquier etapa.
En el ejemplo de código, estás reutilizando el mismo objeto. ¿Qué pasa si Enviar envía el ticket en un hilo de fondo después de un breve retraso (y no toma una copia). Cuando cambia el CacheId, en realidad está actualizando todos los envíos pendientes. Esto también explica por qué un Thread.Sleep soluciona el problema. Prueba esto:
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
}
Si por alguna razón esto no es posible, intente esto y vea si siguen siendo los mismos:
ticket.CacheId = new Guid("00000000-0000-0000-0000-" +
string.Format("{0:000000000000}", i));
Miles de desarrolladores usan Guids en .NET. Si Guid.NewGuid () tuviera alguna tendencia a "atascarse" en un valor, el problema se habría encontrado hace mucho tiempo.
Los pequeños cambios de código son el culpable seguro aquí. El hecho de que Thread.Sleep (que es menos un arenque rojo que un pez que se pudre al sol) "solucione" su problema sugiere que sus propiedades se están configurando de una manera extraña que no puede tener efecto hasta que el ciclo deje de bloquear (ya sea al finalizar o por Thread.Sleep). Incluso estaría dispuesto a apostar que el "cambio menor" era restablecer todas las propiedades de un hilo separado.
Si publicaste algún código de muestra, eso ayudaría.
Vea este artículo sobre cómo se crea un Guid.
Esta artillería vino de Esta respuesta.
En pocas palabras, si está creando los GUID demasiado rápido y el reloj no se ha movido hacia adelante, es por eso que está obteniendo algunos igual. Sin embargo, cuando pones un sueño funciona porque el reloj se ha movido.