Trong hai đoạn mã sau đây, là đoạn mã đầu tiên an toàn hoặc bạn phải làm điều thứ hai?Mã định danh và đóng cửa foreach
An toàn có nghĩa là mỗi luồng được đảm bảo gọi phương thức trên Foo từ cùng một vòng lặp mà trong đó chuỗi được tạo ra?
Hoặc bạn phải sao chép tham chiếu đến biến mới "cục bộ" cho mỗi lần lặp của vòng lặp?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Cập nhật: Như đã chỉ ra trong câu trả lời của Jon Skeet, điều này không có gì đặc biệt để làm với luồng.
Thực ra tôi cảm thấy nó phải làm với luồng như thể bạn không sử dụng luồng, bạn sẽ gọi đại biểu phù hợp. Trong mẫu của Jon Skeet mà không có luồng, vấn đề là có 2 vòng lặp. Đây là chỉ có một, do đó, không nên có vấn đề ... trừ khi bạn không biết chính xác khi nào mã sẽ được thực hiện (có nghĩa là nếu bạn sử dụng luồng - câu trả lời của Marc Gravell cho thấy rằng hoàn hảo). – user276648
có thể trùng lặp của [Truy cập vào Sửa đổi Đóng cửa (2)] (http://stackoverflow.com/questions/304258/access-to-modified-closure-2) – nawfal
@ user276648 Nó không yêu cầu luồng. Trì hoãn việc thực hiện của các đại biểu cho đến sau khi vòng lặp sẽ là đủ để có được hành vi này. – binki