Дубликат возвращен Guid.NewGuid ()?
У нас есть приложение, которое генерирует смоделированные данные для одного из наших сервисов в целях тестирования. Каждый элемент данных имеет уникальный Guid. Однако, когда мы запустили тест после незначительных изменений кода в симуляторе, все объекты, сгенерированные им, имели одинаковый Guid.
Был создан один объект данных, затем цикл for, в котором были изменены свойства объекта, включая новый уникальный Guid, и он был отправлен в службу через удаленное взаимодействие (сериализуемый, а не маршал-по-реф, если это то, что вы Думаете), зациклите и сделайте это снова и т. д.
Если мы поместим небольшой Thread.Sleep (...) внутри цикла, он сгенерирует уникальные идентификаторы. Я думаю, что это красная сельдь, хотя. Я создал тестовое приложение, которое просто создавало один гид за другим и не получало ни одного дубликата.
Моя теория заключается в том, что 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
}