2012-03-08 41 views
6

Từ this bài đăng, tôi đã được thông báo rằng đoạn mã sau bị "hành vi nghiêm trọng đóng kết thúc biến vòng lặp".Đóng trên biến vòng lặp trong C#

foreach (Canidate canidate in allCanidates) 
    { 
     Thread newThread = new Thread(delegate() 
     { 
      BusyWait(canidate); 
     }); 

     newThread.Start(); 
    } 

Tôi chuyển nó như thế này:

foreach (Canidate canidate in allCanidates) 
     { 
      var can = canidate; 
      Thread newThread = new Thread(delegate() 
      {     
       BusyWait(can); 
      }); 

      newThread.Start(); 
     } 

Nhưng ông chủ của tôi vẫn tiếp tục khẳng định rằng nó sẽ bị ảnh hưởng từ những vấn đề tương tự. Tôi đã sử dụng liên kết this để cố gắng giải quyết vấn đề này. Ai đó có thể giúp tôi giải quyết chính xác vấn đề sao cho mã của tôi sẽ thực thi đúng. vấn đề này là hoàn toàn mới đối với tôi, và tôi không chắc tôi có hiểu rõ nó không.

+17

Sếp của bạn sai. –

+16

Và có mái tóc nhọn. –

+0

Bất cứ ai có thể giải thích lý do tại sao? Tôi không chắc tôi hoàn toàn hiểu nó. Chính xác là sự khác biệt giữa hai, bởi vì với tôi, họ có vẻ như họ đang làm điều tương tự. Tuy nhiên, khi tôi chạy nó, tôi biết rằng họ không. – user489041

Trả lời

4

Đóng trên các biến mà sau này thay đổi giá trị là những gì đang gây ra sự cố.

  • candidate thay đổi mỗi "đùi" xung quanh vòng lặp và sẽ vấn đề nguyên nhân.
  • can mới được tạo mỗi "vòng" quanh vòng lặp, không bao giờ thay đổi và sẽ không gây ra sự cố.
+0

Vì vậy, nó thất bại vì kể từ khi ứng cử viên thay đổi mọi "vòng" xung quanh, rằng khi các chủ đề thực sự thực hiện, nó có thể là bất cứ ứng cử viên giá trị hiện nay. Và vì vòng lặp có nhiều khả năng kết thúc trước khi chuỗi bắt đầu, nó thường là mục cuối cùng trong danh sách ứng cử viên? – user489041

+0

@ user489041 Chính xác, nó sẽ nhận được giá trị hiện tại, không phải giá trị mà nó có khi nó được gói. Một biến không thay đổi sẽ giữ giá trị của nó (theo định nghĩa) và không gây ra vấn đề, đó là lý do tại sao tạo một biến mới trong vòng lặp sẽ giải quyết tình huống, nó sẽ vượt ra khỏi phạm vi và được tạo lại thay vì thay đổi. –

Các vấn đề liên quan