ArcObjects .NET - Cách đóng / phát hành FeatureClass, Workspace, Factory


8

Tôi có một quá trình lâu dài. Tôi muốn ngăn chặn rò rỉ tài nguyên hoặc kết nối cơ sở dữ liệu giả mạo.

Tại các khoảng thời gian trong quá trình tôi muốn làm điều này:

  1. có được một nhà máy không gian làm việc ArcSDE (Oracle)
  2. mở một không gian làm việc từ nhà máy (tại đó tôi nhận được kết nối cơ sở dữ liệu mở)
  3. lấy một lớp đối tượng hoặc bảng hiện có trên không gian làm việc,
  4. truy vấn lớp tính năng hoặc bảng, lặp qua con trỏ làm việc của tôi
  5. sau đó phát hành / đóng mọi thứ sao cho :

    • Kết nối cơ sở dữ liệu và khóa bảng theo quan điểm của ArcSDE / Oracle (được tiết lộ bởi một cái gì đó như "sdemon -o information -I users" hoặc truy vấn của bảng sde.table_locks) đã bị đóng / phát hành.
    • quá trình này có khả năng phục hồi khi khởi động lại ArcSDE / Oracle (nghĩa là tôi sẽ không để lại thứ gì đó không hoạt động sau khi khởi động lại hàng đêm)
    • Bất kỳ tài liệu tham khảo RCW, COM và bộ nhớ đều được phát hành.

Về cơ bản, do tính chất kéo dài của quy trình, tôi muốn thực sự chắc chắn rằng tôi không bị rò rỉ tài nguyên hoặc các kết nối giả mạo và quy trình của tôi có thể tồn tại khi khởi động lại ArcSDE / Oracle .

Tôi đã thấy các cuộc thảo luận như:

cái này , từ đó tôi trích dẫn

Mỗi nhà máy không gian làm việc duy trì một nhóm các không gian làm việc đang hoạt động, hiện đang được kết nối được ứng dụng tham chiếu. Khi bất kỳ phương thức Open * nào được liệt kê trước đó được gọi, nhà máy không gian làm việc sẽ xác minh nếu một không gian làm việc đã được mở trước đó với một tập các thuộc tính phù hợp. Nếu vậy, một tham chiếu đến thể hiện hiện tại được trả về.

Tất cả đều gợi ý cho tôi rằng tôi nên phát hành (ví dụ: lớp ComReleaser hoặc vòng lặp Marshal.ReleaseComObject ()), có thể theo thứ tự này:

  • con trỏ
  • bàn / bàn
  • không gian làm việc
  • không gian làm việc

Sau đó, có những cuộc thảo luận như thế này nơi mọi người làm tất cả những điều đó, và thậm chí có thể rắc vào System.GC.Collect () và kết nối cơ sở dữ liệu của họ vẫn tồn tại.

Oh gurus, dope thẳng cuối cùng về điều này là gì?


1
Bạn đã thử bất cứ điều gì cho mình, hoặc bạn chỉ xin lời khuyên? Đặt cược an toàn nhất dường như sinh ra một chủ đề hoặc quy trình mới để làm cho bạn làm việc định kỳ. Mặt khác, theo tôi, nó sẽ hoạt động nếu bạn quản lý để theo dõi tất cả các đối tượng và giải phóng chúng theo kế hoạch của bạn. Nếu bạn có một điều khiển bản đồ, nó cũng có thể chứa các tham chiếu qua các lớp.
Stefan

Tôi đang tiến hành và xin lời khuyên. Đây là một câu hỏi tiếp theo cho nhận xét của bạn - Nếu tôi thực hiện nhiệm vụ định kỳ trên một luồng công nhân, thì công nhân có nên giải phóng nhà máy không gian làm việc hay nó là một đơn vị, điều đó có gây ra các probs cho các luồng đồng thời có thể khác không? Tôi đoán là tôi nên rời khỏi nhà máy một mình?
MC5

Có rất nhiều viết về mô hình luồng đối tượng vòng cung. Đọc edndoc.esri.com/arcobjects/9.2/net/ Khăn (9.2 nhưng tôi vẫn còn hiệu lực). Nó nói rằng singelton là singelton trên mỗi luồng, không phải trên mỗi quy trình. Cũng lưu ý rằng các luồng phải là STA và bạn không thể chuyển các tham chiếu đối tượng vòng cung giữa các luồng. Vì vậy, nếu bạn chấm dứt luồng công nhân, nó sẽ làm sạch các nhà máy. Đồng thời tìm trong liên kết của riêng bạn đến diễn đàn ESRI nơi ESRI được đề xuất luồng như một giải pháp để giải phóng các kết nối.
Stefan

Câu trả lời:


4

Bạn đã bao gồm nhiều khía cạnh trong bài viết của bạn. Tuy nhiên để mở rộng câu hỏi của bạn, hãy luôn theo mô hình này:

if (obj!=null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(obj);

obj = null;

Sau đó gọi System.GC.Collect()để buộc bộ thu gom rác loại bỏ mọi tham chiếu đến DBMS.

Thứ tự phát hành phải là Con trỏ, Tính năng (IFeature), FeatureClass, Không gian làm việc và các ArcObject khác được khởi tạo.

Ứng dụng ArcGIS Desktop và ArcEngine là STA (ứng dụng đơn luồng). Không an toàn và cũng không nên sử dụng ArcObjects trên các luồng (Công nhân); Người ta có thể sử dụng tuần tự hóa và giải tuần tự hóa các đối tượng để đạt được điều này. Để biết thêm chi tiết, hãy xem ở đây .

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.