Thực ra, chỉ cần thực hiện lock
ở một nơi trên DataTable hoặc DataRow không thực sự là làm bất kỳ thứ gì. Một khía cạnh quan trọng cần nhớ khi sử dụng khóa Monitor
(đó là khối lock
) là khóa một đối tượng không làm gì với nó; đó là một lý do mà một số người ủng hộ sử dụng các đối tượng khóa chuyên dụng hơn là khóa tài nguyên, vì nó buộc bạn phải nhận ra rằng bạn phải thực hiện khóa (và trên cùng một đối tượng) bất cứ khi nào bạn xử lý tài nguyên.
Điều đó đang được nói, tốt hơn nên khóa toàn bộ DataTable
, vì bản thân lưu trữ dữ liệu ở đó (các đối tượng DataRow
nội bộ chỉ chứa bù đắp vào DataTable
về nơi để truy xuất dữ liệu). Vì điều này, ngay cả khi bạn đồng bộ hóa quyền truy cập vào các hàng riêng lẻ, việc cập nhật hai hàng khác nhau đồng thời sẽ khiến bạn cập nhật cùng một cơ chế lưu trữ dữ liệu theo cách không đồng bộ. Có một cuộc xung đột ở đây giữa việc xem các loại nội bộ dưới dạng "hộp đen" và chỉ khóa những gì bạn cần (trong trường hợp này, sẽ dẫn bạn đến một kết luận bị lỗi khi chỉ khóa hàng) và cố gắng có được thông tin chi tiết vào các hoạt động nội bộ của loại và dựa vào chi tiết triển khai có thể thay đổi.
Kết quả là, ngay bây giờ, bạn nên khóa toàn bộ DataTable
để tránh cập nhật hệ thống lưu trữ dữ liệu nội bộ theo cách không đồng bộ.
Nguồn
2010-04-09 13:45:28
Câu trả lời rất sâu sắc, và tôi có thể thấy lý do tại sao bạn cảm thấy cần phải chỉ ra cơ chế 'khóa' hoạt động như thế nào ... Tôi đã nhận ra rằng khóa không làm bất kỳ thứ nào * thành * một đối tượng; Tôi cho rằng một cách tốt hơn tôi có thể đặt ra câu hỏi của mình là "Tôi có cần phải đồng bộ hóa các hoạt động cập nhật cho mỗi hàng hoặc mỗi bảng không?" Trong mọi trường hợp, rõ ràng với tôi vào thời điểm này, tôi phải đồng bộ hóa các cập nhật cho * bất kỳ * hàng nào trên toàn bộ bảng - cho dù bằng cách khóa bảng hay "khóa bàn" chuyên dụng (trong trường hợp này, tôi nghĩ là hàng 'Rows '). Đối tượng SyncRoot' phục vụ mục đích đó, thực sự). –