Phương pháp # 1:
Phương pháp đơn giản nhất và hiệu quả nhất là tạo ra một phần quan trọng đối với các độc giả và nhà văn.
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
lock (aList)
{
foreach (T name in aList)
{
name.doSomething();
}
}
Phương pháp # 2:
này tương tự như phương pháp # 1, nhưng thay vì giữ khóa cho toàn bộ thời gian của foreach
vòng lặp bạn sẽ sao chép các bộ sưu tập đầu tiên và sau đó lặp qua các sao chép.
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
List<T> copy;
lock (aList)
{
copy = new List<T>(aList);
}
foreach (T name in copy)
{
name.doSomething();
}
Phương pháp # 3:
Tất cả phụ thuộc vào tình hình cụ thể của bạn, nhưng cách tôi thường đối phó với điều này là để giữ cho các tài liệu tham khảo tổng thể để các bộ sưu tập không thay đổi. Bằng cách đó bạn không bao giờ phải đồng bộ hóa quyền truy cập ở phía người đọc. Phía nhà văn của sự vật cần một lock
. Phía người đọc không cần gì có nghĩa là người đọc ở mức cao đồng thời. Điều duy nhất bạn cần làm là đánh dấu tham chiếu aList
là volatile
.
// Variable declaration
object lockref = new object();
volatile List<T> aList = new List<T>();
// Writer
lock (lockref)
{
var copy = new List<T>(aList);
copy.Remove(item);
aList = copy;
}
// Reader
List<T> local = aList;
foreach (T name in local)
{
name.doSomething();
}
Nguồn
2012-04-04 20:01:06
Cảm ơn, hoạt động như một nét duyên dáng :) Hãy hy vọng tôi sẽ không gặp phải bất kỳ vấn đề gì về hiệu năng bằng cách sử dụng .. –