กฎการปล่อย ArcObjects จากหน่วยความจำใน. NET มีอะไรบ้าง?


14

ฉันจำเป็นต้องปล่อยแต่ละวัตถุหรือไม่ มีการจัดการหน่วยความจำบางอย่างสำหรับฉันหรือไม่?

คำตอบ:


18

สิ่งที่สะดุดตาที่สุดคือปล่อยเคอร์เซอร์ไว้อย่างชัดเจนเสมอเมื่อคุณทำเสร็จแล้ว ฉันยังปล่อยวัตถุแจงนับบางอย่างที่บ่งบอกถึงการเข้าถึงฐานข้อมูลเช่นIEnumRelationshipคุณได้รับจากIRelationshipClass.GetRelationshipsForObject

นอกจากนี้เมื่อคุณสร้างอินสแตนซ์ COM จำนวนมากซึ่งมีอายุสั้น (โดยเฉพาะในลูปแบบคับ) มันเป็นความคิดที่ดีที่จะเผยแพร่อย่างชัดเจน

นอกจากนี้ยังมีสถานการณ์จำลองที่แนะนำให้เผยแพร่การอ้างอิงแต่ละคุณสมบัติ (แถว) ตัวอย่างเช่นหากคุณสร้างเวอร์ชันฐานข้อมูลภูมิศาสตร์ใหม่แก้ไขข้อมูลกระทบยอด & โพสต์ความพยายามในการลบรุ่นหลังจากนั้นอาจล้มเหลวเนื่องจากอาจมีแถวที่ยังไม่เผยแพร่ซึ่งจะอ้างอิงกับเวอร์ชัน (พื้นที่ทำงาน) ที่คุณพยายามลบ แม้ว่าส่วนใหญ่แล้วสถานการณ์เหล่านี้จะหายากและคุณไม่จำเป็นต้องพิจารณาสถานการณ์เหล่านี้ในการพัฒนา ArcObjects แบบวันต่อวัน มันจะทำให้โค้ดยุ่งเหยิงไปกับการล้างข้อมูลภายนอกทำให้สามารถบำรุงรักษาได้น้อยลง

นอกจากนี้ยังเป็นสิ่งสำคัญที่จะต้องบอกว่าเมื่อใดที่จะไม่ปล่อย. NET wrappers ไม่ควรปล่อย RCW ของ ArcObjects อย่างชัดเจน ตัวอย่างหนึ่งของสิ่งนี้ - อย่าปล่อย IMap เมื่ออยู่ใน ArcMap โดยทั่วไปอย่าพยายามปล่อย ArcObjects ที่คุณไม่ได้สร้าง


6

ส่วนใหญ่การรวบรวมขยะ. NET ทำงานได้ดี มีบางกรณีใน ArcObjects ที่ทำงานสำคัญกับ desctructors และลักษณะที่ไม่สามารถกำหนดค่าได้ของ wrapper .NET สามารถทำให้เกิดปัญหาได้ นี้หัวข้อความช่วยเหลือครอบคลุมกรณีหลักที่จะกังวลเกี่ยวกับวิธีการจัดการประชาสัมพันธ์


2
ลิงค์เดียวกันใน 10: help.arcgis.com/th/sdk/10.0/arcobjects_net/conceptualhelp/ …
MathiasWestin

2

ทำลายเสมอ:

  • ICursors
  • IEnums

ระวังอย่าทำลายสิ่งที่ใช้อยู่ในที่อื่น

วันนี้ฉันอ่านการอภิปรายที่น่าสนใจในเว็บไซต์ ESRIs ที่ Kirk เข้าร่วม มีความคิดเห็นที่น่าสนใจอื่น ๆ เช่นการใช้วิธี ReleaseComObject และ FinalReleaseComObject (หรืออะไรทำนองนี้) ขออภัยฉันไม่มีลิงค์ให้ฉันตอนนี้

บางคนถึงกับแนะนำให้ปล่อย IRows แต่หลายคนก็เห็นว่ามันง่ายกว่าที่จะให้ GC จัดการกับมันโดยตรง

ฉันไม่เคยปล่อย IGeometry ใด ๆ มีใครลองบ้าง


1

ฉันจะใช้ ESRI.ArcGIS.ADF.ComReleaser ที่ถูกกล่าวว่าฉันไม่แน่ใจว่าวัตถุ arc ใดใช้รูปแบบการเปิดตัวที่กำหนดขึ้น แต่ฉันส่วนใหญ่แนบกับวัตถุ IServerContext เนื่องจากเป็นสิ่งที่สำคัญที่สุด

using (ComReleaser comReleaser = new ComReleaser())
{

}

นี่คือข้อมูลบางส่วนที่ฉันสามารถรับได้ในการประชุมสุดยอดนักพัฒนา ESRI 2011

รายการใหญ่ที่ฉันจำได้คือสำหรับวัตถุเดี่ยว (ซึ่งเป็นสองหัวข้อลงในความช่วยเหลือ)

นี่คือลิงก์จากแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ ArcObjects ใน. NET "ปล่อยการอ้างอิง COM" หัวข้อ: http://help.arcgis.com/th/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

และนี่คือโพสต์ในบล็อก Geodatabase ไปยังการอภิปรายสี่เมตรที่มีรายการวัตถุ: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with -comreleaser_3f00_.aspx

(สุดท้ายโพสต์บล็อกพร้อมลิงก์เพื่อช่วยในกรณีที่ url ใช้งานไม่ได้) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage -The ชีวิตของเคอร์เซอร์ใน .net.aspx


เมื่อทำงานกับ IServerContext สิ่งที่สำคัญกว่า (มากกว่าการปล่อย. NET RCW เหมือน ComReleaser) คือการเรียก ReleaseContext วิธีที่ดีที่สุดคือการห่อบริบทในชั้นเรียนสุทธิการดำเนิน IDisposable (และต่อไปนี้รูปแบบทิ้งมาตรฐานรวมทั้งการดำเนินการ finalizer) ที่
ปีเตอร์เครบส์

@ สัตว์เลี้ยงใช่ releaseContext มีขนาดใหญ่มากและบางสิ่งบางอย่างที่ฉันไม่ได้มองข้าม แต่ขอบคุณที่เขียนไว้เพื่อคนอื่น
Steve

2
ฉันเชื่อว่า ComReleaser เป็นส่วนหนึ่งของชุดประกอบ 32 บิตซึ่งหมายความว่าคุณจะไม่สามารถเรียกใช้ ComReleaser ในกระบวนการ 64 บิต (เช่น ArcGIS Server) ฉันกำลังเขียน SOE และถูกเผาในเรื่องนี้
bcollins

มีตัวเลือกอื่นสำหรับการปล่อยเซิร์ฟเวอร์หรือไม่
VBAHole

@VBA ไม่ใช่ว่าฉันสังเกตเห็น แม้แต่ที่ 10.5.1 arcobjects
Steve

0

อย่าลืมวัตถุของ IWorkspace ที่การประชุมสุดยอด ESRI dev เมื่อสองสามปีก่อนฉันถามคำถามและคำตอบจาก ESRI คือวัตถุของ ICursor และ IWorkspace


ไม่มีประโยชน์ที่จะปล่อยเวิร์กสเปซเนื่องจากแคชโรงงานเวิร์กสเปซเดี่ยวถูกแคช
เพรสตัน

0

กฎแตกต่างกันเมื่อทำงานกับเซิร์ฟเวอร์วัตถุเช่นเคอร์เซอร์ในซอยหรือไม่ ฉันกำลังพยายามใช้ ComReleaser แต่ก็ล้มเหลวทุกครั้งที่ได้รับวิธีการใกล้เคียงในรหัส Soi ของฉัน


อย่าโพสต์คำถามเป็นคำตอบสำหรับคำถามที่มีอยู่ โพสต์เป็นคำถามใหม่พร้อมลิงค์ไปยังคำถามที่มีอยู่
Bjorn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.