ฉันจำเป็นต้องปล่อยแต่ละวัตถุหรือไม่ มีการจัดการหน่วยความจำบางอย่างสำหรับฉันหรือไม่?
ฉันจำเป็นต้องปล่อยแต่ละวัตถุหรือไม่ มีการจัดการหน่วยความจำบางอย่างสำหรับฉันหรือไม่?
คำตอบ:
สิ่งที่สะดุดตาที่สุดคือปล่อยเคอร์เซอร์ไว้อย่างชัดเจนเสมอเมื่อคุณทำเสร็จแล้ว ฉันยังปล่อยวัตถุแจงนับบางอย่างที่บ่งบอกถึงการเข้าถึงฐานข้อมูลเช่นIEnumRelationshipคุณได้รับจากIRelationshipClass.GetRelationshipsForObject
นอกจากนี้เมื่อคุณสร้างอินสแตนซ์ COM จำนวนมากซึ่งมีอายุสั้น (โดยเฉพาะในลูปแบบคับ) มันเป็นความคิดที่ดีที่จะเผยแพร่อย่างชัดเจน
นอกจากนี้ยังมีสถานการณ์จำลองที่แนะนำให้เผยแพร่การอ้างอิงแต่ละคุณสมบัติ (แถว) ตัวอย่างเช่นหากคุณสร้างเวอร์ชันฐานข้อมูลภูมิศาสตร์ใหม่แก้ไขข้อมูลกระทบยอด & โพสต์ความพยายามในการลบรุ่นหลังจากนั้นอาจล้มเหลวเนื่องจากอาจมีแถวที่ยังไม่เผยแพร่ซึ่งจะอ้างอิงกับเวอร์ชัน (พื้นที่ทำงาน) ที่คุณพยายามลบ แม้ว่าส่วนใหญ่แล้วสถานการณ์เหล่านี้จะหายากและคุณไม่จำเป็นต้องพิจารณาสถานการณ์เหล่านี้ในการพัฒนา ArcObjects แบบวันต่อวัน มันจะทำให้โค้ดยุ่งเหยิงไปกับการล้างข้อมูลภายนอกทำให้สามารถบำรุงรักษาได้น้อยลง
นอกจากนี้ยังเป็นสิ่งสำคัญที่จะต้องบอกว่าเมื่อใดที่จะไม่ปล่อย. NET wrappers ไม่ควรปล่อย RCW ของ ArcObjects อย่างชัดเจน ตัวอย่างหนึ่งของสิ่งนี้ - อย่าปล่อย IMap เมื่ออยู่ใน ArcMap โดยทั่วไปอย่าพยายามปล่อย ArcObjects ที่คุณไม่ได้สร้าง
ส่วนใหญ่การรวบรวมขยะ. NET ทำงานได้ดี มีบางกรณีใน ArcObjects ที่ทำงานสำคัญกับ desctructors และลักษณะที่ไม่สามารถกำหนดค่าได้ของ wrapper .NET สามารถทำให้เกิดปัญหาได้ นี้หัวข้อความช่วยเหลือครอบคลุมกรณีหลักที่จะกังวลเกี่ยวกับวิธีการจัดการประชาสัมพันธ์
ทำลายเสมอ:
ระวังอย่าทำลายสิ่งที่ใช้อยู่ในที่อื่น
วันนี้ฉันอ่านการอภิปรายที่น่าสนใจในเว็บไซต์ ESRIs ที่ Kirk เข้าร่วม มีความคิดเห็นที่น่าสนใจอื่น ๆ เช่นการใช้วิธี ReleaseComObject และ FinalReleaseComObject (หรืออะไรทำนองนี้) ขออภัยฉันไม่มีลิงค์ให้ฉันตอนนี้
บางคนถึงกับแนะนำให้ปล่อย IRows แต่หลายคนก็เห็นว่ามันง่ายกว่าที่จะให้ GC จัดการกับมันโดยตรง
ฉันไม่เคยปล่อย IGeometry ใด ๆ มีใครลองบ้าง
ฉันจะใช้ 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
อย่าลืมวัตถุของ IWorkspace ที่การประชุมสุดยอด ESRI dev เมื่อสองสามปีก่อนฉันถามคำถามและคำตอบจาก ESRI คือวัตถุของ ICursor และ IWorkspace
กฎแตกต่างกันเมื่อทำงานกับเซิร์ฟเวอร์วัตถุเช่นเคอร์เซอร์ในซอยหรือไม่ ฉันกำลังพยายามใช้ ComReleaser แต่ก็ล้มเหลวทุกครั้งที่ได้รับวิธีการใกล้เคียงในรหัส Soi ของฉัน