Các quy tắc để phát hành ArcObjects từ bộ nhớ trong .NET là gì?


14

Tôi có cần phải phát hành từng đối tượng? Là một số quản lý bộ nhớ xử lý cho tôi?

Câu trả lời:


18

Đáng chú ý nhất, luôn luôn giải phóng con trỏ một cách rõ ràng khi bạn hoàn thành chúng. Tôi cũng phát hành một số đối tượng liệt kê có nghĩa là truy cập cơ sở dữ liệu, ví dụ IEnumRelationship bạn nhận được từ IRelationshipClass.GetRelationshipsForObject .

Ngoài ra, khi bạn tạo ra nhiều phiên bản COM tồn tại trong thời gian ngắn (đặc biệt là trong các vòng lặp chặt chẽ), bạn cũng nên phát hành chúng một cách rõ ràng.

Cũng có những kịch bản khi phát hành các tham chiếu tính năng (hàng) riêng lẻ. Ví dụ: nếu bạn tạo phiên bản cơ sở dữ liệu địa lý mới, chỉnh sửa dữ liệu, đối chiếu & đăng bài, cố gắng xóa phiên bản sau đó có thể không thành công do có thể có các hàng chưa được phát hành, do đó sẽ giữ tham chiếu đến phiên bản (không gian làm việc) mà bạn đang cố gắng xóa. Mặc dù vậy, hầu hết các kịch bản như vậy rất hiếm và bạn không cần tính đến chúng trong quá trình phát triển ArcObjects hàng ngày của mình. Nó sẽ chỉ làm cho mã bị lộn xộn với việc dọn dẹp bên ngoài, làm cho nó ít được bảo trì hơn.

Một điều cũng quan trọng để nói khi không phát hành trình bao bọc .NET - không bao giờ phát hành RCW của ArcObjects rõ ràng có thể được sử dụng bởi bất kỳ mã được quản lý nào khác. Một ví dụ về điều này - không phát hành IMap khi ở ArcMap. Nói chung, đừng cố gắng phát hành ArcObjects mà bạn không tạo.


6

Đối với hầu hết các bộ sưu tập rác .NET hoạt động tốt. Có một số trường hợp trong ArcObject thực hiện công việc quan trọng đối với bộ giải mã và bản chất không xác định của trình bao bọc .NET có thể gây ra sự cố. Đây chủ đề trợ giúp bao gồm các trường hợp tiểu học phải được quan tâm về và làm thế nào để quản lý phiên bản.



2

Luôn luôn tiêu diệt:

  • ICursors
  • IEnums

Hãy cẩn thận để không phá hủy thứ gì đó đang được sử dụng ở nơi khác.

Hôm nay tôi đọc một cuộc thảo luận thú vị trên trang web ESRIs mà Kirk tham gia. Có nhiều ý kiến ​​rất thú vị khác, chẳng hạn như việc sử dụng phương thức ReleaseComObject và FinalReleaseComObject (hoặc một cái gì đó tương tự). Xin lỗi tôi không có liên kết với tôi ngay bây giờ.

Một số người thậm chí còn đề nghị phát hành IRows, nhưng nhiều người đồng ý rằng việc để GC xử lý chúng trực tiếp sẽ dễ dàng hơn.

Tôi không bao giờ phát hành bất kỳ IGeometry's. Có ai đã thử chưa?


1

Tôi sẽ sử dụng ESRI.ArcGIS.ADF.ComReleaser. Điều đó đang được nói rằng tôi không chắc chắn chính xác những đối tượng vòng cung nào sử dụng mẫu phát hành xác định nhưng tôi chủ yếu gắn nó vào đối tượng IServerContext vì đó là điều quan trọng nhất.

using (ComReleaser comReleaser = new ComReleaser())
{

}

Dưới đây là một số thông tin tôi có thể có được tại hội nghị thượng đỉnh Nhà phát triển esri 2011.

Danh sách lớn mà tôi đã nhớ là dành cho các đối tượng đơn lẻ (có hai chủ đề trong trợ giúp).

Đây là liên kết từ các Thực tiễn tốt nhất để sử dụng ArcObjects trong .NET "Phát hành tài liệu tham khảo COM": http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Release_COM_Vferences/0001000004t0000

Và đây là một bài đăng trên Blog Geodatabase cho một cuộc thảo luận dài bốn triệu có chứa một danh sách các đối tượng: http://blogs.esri.com/dev/bloss/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx

(cuối cùng là một bài đăng blog với một liên kết để trợ giúp trong trường hợp url không hoạt động) http://bloss.esri.com/dev/bloss/geodatabase/archive/2008/12/18/USE‑the‑comreleaser‑to‑manage The ‑ trọn đời ‑ của con trỏ ‑ trong net .net.aspx


Khi làm việc với IServerContext, điều quan trọng hơn (hơn là phát hành .NET RCW của nó như ComReleaser làm) là gọi ReleaseContext trên đó. Cách tốt nhất là bọc bối cảnh trong lớp .NET triển khai IDis Dùng (và theo mẫu xử lý tiêu chuẩn bao gồm triển khai trình hoàn thiện)
Petr Krebs

@Petr có phát hành Nội dung là rất lớn và một cái gì đó tôi đã bỏ qua nhưng cảm ơn vì đã viết nó cho những người khác.
Steve

2
Tôi tin rằng ComReleaser là một phần của hội đồng 32 bit, nghĩa là bạn sẽ không thể chạy ComReleaser trong quy trình 64 bit (ví dụ: ArcGIS Server). Tôi đã viết một SOE và bị đốt cháy về điều này.
bcollins

Có những lựa chọn khác cho việc phát hành Máy chủ?
VBAHole

@VBAHole không phải là tôi đã nhận thấy. Ngay cả ở 10,5,1 arcobjects.
Steve

0

Đừng quên các đối tượng IWorkspace. Tại Hội nghị thượng đỉnh ESRI vài năm trước, tôi đã đặt câu hỏi và câu trả lời từ ESRI là các đối tượng ICthon và IWorkspace.


Không có điểm nào để phát hành các không gian làm việc bởi vì chúng được lưu trữ bởi các singletons của không gian làm việc.
Preston

0

các quy tắc có khác nhau khi làm việc với các Đối tượng Máy chủ như Con trỏ trong SOI không? Tôi đang cố gắng sử dụng ComReleaser nhưng không thành công mỗi khi nó đến bất kỳ nơi nào gần phương thức trong mã SOI của tôi


Đừng đăng câu hỏi dưới dạng câu trả lời cho câu hỏi hiện có. Gửi nó như một câu hỏi mới, với một liên kết đến câu hỏi hiện có.
Bjorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.