2008-10-28 27 views
5

Trong khi điều tra rò rỉ bộ nhớ, tôi phát hiện ra rằng nó được gây ra bằng cách gọi NewRow() trên Bảng trong vòng lặp nhiều lần. Tuy nhiên DataRow được tạo ra chưa bao giờ được thêm vào bộ sưu tập Table Rows và Table Rows Count chưa bao giờ đạt trên 0.Bảng NewRow() Gây ra rò rỉ bộ nhớ

Câu hỏi của tôi là tại sao điều này sử dụng nhiều bộ nhớ hơn mỗi khi NewRow được gọi ngay cả khi DataRow mới tạo không bao giờ được thêm vào bộ sưu tập hàng và DataRow được trả về từ NewRow luôn được gán cho cùng biến cục bộ (do đó loại bỏ rõ ràng hàng mới cuối cùng).

Vui lòng bỏ qua vấn đề tại sao mã tạo DataRows không được thêm vào bảng!

Trả lời

5

DataRow kế thừa giản đồ từ DataTable, do đó, có tham chiếu từ DataRow đến lược đồ bảng đã tạo hàng. Hàng mới nằm trong trạng thái Tách rời trong bảng.
đây là lý do tại sao GC chỉ để lại các hàng mới chưa sử dụng.

1

Tôi nghĩ rằng hai vấn đề của bạn có liên quan.

Bảng.NewRow tạo hàng dữ liệu mới có cùng định dạng cột như Bảng ban đầu.

Hàng mới này cần phải được thêm vào bảng bằng cách sử dụng bảng.Rows.Add (newRow). Vòng lặp của bạn sẽ tạo các đối tượng không bao giờ được sử dụng và do đó sẽ ăn bộ nhớ. Xem bài viết này để biết thêm thông tin http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

+0

Xin chào Stephen, tôi hiểu rằng, tôi không chắc tại sao nó sử dụng bộ nhớ khi hàng không bao giờ được sử dụng. Tôi đoán tôi đã sau khi một số thông tin sâu hơn về những gì diễn ra đằng sau hậu trường trong DataTable. –

4

DataTable.NewRow() thêm hàng đã tạo vào RecordManager của DataTable. Tôi không hoàn toàn chắc chắn tại sao điều này xảy ra, nhưng đây là lý do tại sao nó không được giải thoát bởi GC.

Dường như chỉ có hai cách để thoát khỏi DataRow:

  1. Thêm nó vào bảng, sau đó xóa nó.
  2. Gọi DataTable.Clear().
Các vấn đề liên quan