Chúng tôi có một ứng dụng tạo dữ liệu mô phỏng cho một trong các dịch vụ của chúng tôi cho mục đích thử nghiệm. Mỗi mục dữ liệu có một Hướng dẫn duy nhất. Tuy nhiên, khi chúng tôi chạy một thử nghiệm sau khi một số mã nhỏ thay đổi để giả lập tất cả các đối tượng được tạo ra bởi nó có cùng một hướng dẫn.Bản sao được trả lại bởi Guid.NewGuid()?
Có một đối tượng dữ liệu được tạo, sau đó là vòng lặp for nơi các thuộc tính của đối tượng đã được sửa đổi, bao gồm một Guid duy nhất mới và nó được gửi đến dịch vụ qua remoting (serializable, chứ không phải marshal-by-ref, nếu đó là những gì bạn đang suy nghĩ), lặp lại và làm lại, v.v.
Nếu chúng ta đặt một Thread.Sleep (...) nhỏ trong vòng lặp, nó tạo ra id duy nhất. Tôi nghĩ rằng đó là một cá trích đỏ. Tôi tạo ra một ứng dụng thử nghiệm mà chỉ cần tạo ra một guid sau khi khác và không nhận được một bản sao duy nhất.
Lý thuyết của tôi là IL được tối ưu hóa theo cách gây ra hành vi này. Nhưng đủ về lý thuyết của tôi. Bạn nghĩ sao? Tôi đang mở để gợi ý và cách để kiểm tra nó.
CẬP NHẬT: Dường như có nhiều nhầm lẫn về câu hỏi của tôi, vì vậy hãy để tôi làm rõ. Tôi KHÔNG nghĩ rằng NewGuid() bị hỏng. Rõ ràng nó hoạt động. Tốt rồi! Có một lỗi ở đâu đó, điều đó khiến cho NewGuid() thành một trong hai: 1) chỉ được gọi một lần trong vòng lặp của tôi 2) được gọi là mọi lúc trong vòng lặp của tôi nhưng chỉ được gán một lần 3) cái gì khác mà tôi chưa từng nghĩ đến
Lỗi này có thể nằm trong mã của tôi (có khả năng nhất) hoặc trong tối ưu hóa ở đâu đó.
Vì vậy, để nhắc lại câu hỏi của mình, tôi nên gỡ lỗi kịch bản này như thế nào?
(và cảm ơn bạn đã thảo luận rất lớn, điều này thực sự đã giúp tôi làm rõ các vấn đề trong tâm trí của tôi)
CẬP NHẬT # 2: Tôi rất muốn gửi một ví dụ cho thấy vấn đề, nhưng đó là một phần của vấn đề của tôi. Tôi không thể sao chép nó bên ngoài toàn bộ các ứng dụng (máy khách và máy chủ).
Dưới đây là một đoạn có liên quan mặc dù:
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
}
Nếu bạn nghĩ rằng có một lỗi trong IL - sử dụng Reflector để theo dõi nó xuống. –
Ah, vâng. Tôi nghĩ về điều đó. Nhưng dự đoán ban đầu của tôi là nó có thể nằm trong trình tối ưu hóa JIT. Không thể sử dụng Reflector cho điều đó. – dviljoen
Nếu bạn không nghĩ đó là lỗi của NewGuid, hãy đăng một số mã hiển thị sự cố.Hoặc, ít nhất, hãy đăng mã * có * vấn đề. Ngoài ra, hãy trả lời câu hỏi về việc xóa Thread.Sleep có gây ra sự cố xuất hiện lại hay không. Tôi khá giỏi trong việc gỡ rối tâm linh - nhưng thậm chí tốt hơn với một số chi tiết. –