2011-02-07 29 views
12

Làm cách nào để xử lý Dữ liệu LINQ-to_SQL trên nhiều luồng?Dữ liệu LINQ-to-SQL trên nhiều chủ đề

Tôi có nên tạo một DataContext tĩnh toàn cục mà tất cả các chủ đề sử dụng và cam kết thay đổi vào cuối hay tôi nên tạo một bối cảnh cho mỗi luồng và sử dụng cá thể đó cho mọi thứ bên trong chuỗi đó?

Trả lời

15

DataContext không phải là chủ đề an toàn; sử dụng nó trực tiếp từ nhiều chủ đề sẽ gây ra #fail; có bối cảnh dữ liệu tĩnh toàn cục sẽ gây ra #fail sẽ gây ra sự tăng trưởng bộ nhớ không kiểm soát được (ngữ cảnh dữ liệu bao gồm trình quản lý danh tính và trình theo dõi thay đổi cho mọi đối tượng được tìm nạp; điều này chỉ tăng theo thời gian.

Ngữ cảnh dữ liệu lý tưởng nên được sử dụng cho một đơn vị công việc; quay lên một; làm một cái gì đó (bị ràng buộc trong phạm vi - nghĩa là không phải toàn bộ thời gian của ứng dụng) và hủy bỏ nó. Vì vậy, IMO câu trả lời thực sự ở đây là "buộc nó vào đơn vị công việc đó". Chỉ bạn mới có thể biết điều gì trong ứng dụng của bạn; nó có thể là một phương pháp duy nhất, nó có thể là một yêu cầu trang trên một trang web, nó có thể là một bộ đếm thời gian "đánh dấu" trong một dịch vụ. Ai biết được ...

+0

Tại sao luồng không an toàn? MSDN không có gì về điều này hoặc tại sao. – paIncrease

+1

@ Rancur3p1c "tại sao": bởi vì các bộ sưu tập là * hiếm khi * thread-an toàn, và có cùng bối cảnh nói trên cùng một kết nối nhiều lần cùng một lúc sẽ là một cơn ác mộng. Tuyên bố từ chối trách nhiệm thông thường là có: "Bất kỳ thành viên tĩnh nào (Được chia sẻ trong Visual Basic) thuộc loại này đều là an toàn chủ đề. Bất kỳ thành viên nào không được bảo đảm là luồng an toàn". xem http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx –

+0

@Marc Gravell: Không an toàn thread không giống như thất bại khi được truy cập từ một chuỗi khác. Truy cập vào các biến toàn cầu từ các luồng khác nhau có thể được thực hiện một cách an toàn miễn là các cơ chế khóa thích hợp được đặt đúng chỗ. Ngược lại, truy cập từ các chủ đề không phải giao diện người dùng đến các thành phần giao diện người dùng thực sự bị cấm và sẽ gây ra các ngoại lệ thời gian chạy. Gọi từ các chủ đề nền vào chuỗi giao diện người dùng là bắt buộc trong các trường hợp như vậy. Bạn có căn cứ vào yêu cầu #fail của mình về tài liệu nào? Bởi vì bạn làm cho nó âm thanh như trường hợp chủ đề giao diện người dùng ... – Christoph

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