Tôi đã gặp một số vấn đề với LINQ-To-SQL xung quanh việc sử dụng bộ nhớ. Tôi đang sử dụng nó trong một dịch vụ Windows để làm một số xử lý, và tôi đang lặp qua một lượng lớn dữ liệu mà tôi đang kéo trở lại từ ngữ cảnh. Có - Tôi biết tôi có thể làm điều này với một thủ tục được lưu trữ nhưng có những lý do tại sao đó sẽ là một giải pháp ít hơn lý tưởng.Làm thế nào để tránh rò rỉ bộ nhớ bằng LINQ-To-SQL?
Dù sao, những gì tôi nhìn thấy cơ bản là bộ nhớ không được phát hành ngay cả sau khi tôi gọi context.SubmitChanges()
. Vì vậy, tôi cuối cùng phải làm tất cả những thứ kỳ quặc như chỉ kéo lùi 100 bản ghi vào thời gian, hoặc tạo ra một số bối cảnh và khiến tất cả họ thực hiện các nhiệm vụ riêng biệt. Nếu tôi giữ nguyên DataContext
và sử dụng nó sau này cho các cuộc gọi khác, nó chỉ ăn ngày càng nhiều bộ nhớ. Ngay cả khi tôi gọi Clear()
trên mảng "var tableRows
" mà truy vấn trả lại cho tôi, đặt thành giá trị rỗng và gọi SYstem.GC.Collect()
- nó vẫn không giải phóng bộ nhớ.
Bây giờ tôi đã đọc một số cách bạn nên sử dụng nhanh chóng và loại bỏ chúng một cách nhanh chóng, nhưng có vẻ như chúng phải là một cách để buộc bối cảnh đổ tất cả dữ liệu của nó (hoặc tất cả dữ liệu theo dõi của nó) bảng cụ thể) tại một thời điểm nhất định để đảm bảo bộ nhớ là miễn phí.
Bất kỳ ai biết các bước nào đảm bảo rằng bộ nhớ được giải phóng?
Lưu ý rằng như các quý ông khác đã nói, có lẽ tốt hơn là nên sử dụng nhiều DataContexts trong tình huống này. Nhưng, vì câu hỏi là làm thế nào để đảm bảo việc giải phóng bộ nhớ trong một ngữ cảnh, phương thức ClearCache() gần hơn với câu trả lời. –
Có, sử dụng hay không nhiều datacontext phụ thuộc vào số lượng dữ liệu của bạn, bạn có thể tìm hiểu làm thế nào để đối phó với điều này, tôi học từ RobConery MVC Road series ... http://blog.wekeroad.com/category/mvc-storefront –
InvokeMember context.GetType() ( \t "ClearCache", \t BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, \t null, bối cảnh, null);: đây là cách bạn có thể gọi ClearCache(). – Rafe