Nine MVP's Blog

12/08/2006

การ Release COM Object ออกจาก Memory ของระบบ

Filed under: Uncategorized — Nine MVP @ 9:34 pm

ปกติแล้วบางครั้งอาจจะหลีกเลี่ยงไม่ได้ที่จะต้องใช้ COM object ในโปรแกรมของเรา

เมื่อเรา add COM  เข้ามาในโปรเจ็ค .NET จะทำตัว Wrapper ที่เรียกเป็นทางการว่า Runtime Callable Wrapper (RCW) ห่อหุ่มและให้เราเรียกใช้ COM Object  นั้นได้อย่างง่ายดาย
 
เพียงแต่ว่าหลังจากการสร้างมันขึ้นมาแล้วนั้น หลังจากใช้งานเสร็จ
จะทำลายทิ้งและคืนหน่วยความจำให้ระบบนั้นช่างแสนยากเย็น และเป็นอันตรายค่อนข้างมาก ในกรณีที่เป็นระบบใหญ่ ๆ
เพราะตัวที่จะถูก GC เก็บกวาดนั้นมีเพียงแค่ RCW ซึ่งหากคุณลืมที่จะลด reference count ของ COM Object ให้เหลือค่า 0 นั้น คุณก็จะไม่สามารถเข้าถึงและควบคุมการทำงานของมันได้อีกเลย เพราะ RCW ได้ถูกทำลายทิ้งไปก่อนแล้ว และ COM Object นั้นจะคงอยู่ใน Startup Time ของ Server นั้นไปตลอด
 
ใน .NET 1.0 , 1.1 นั้นเรามี Method ที่จะช่วย repeat ค่าให้ลดลงจน เป็น 0 นั่นคือ

System.Runtime.InteropServices.Marshal.ReleaseComObject()

แต่ method ตัวนี้เราต้อง repeat ค่าใน Loop จนค่าเป็น 0 ดังนี้

 

ตัวอย่าง

If Not Cipher Is Nothing Then

    Do

        If System.Runtime.InteropServices.Marshal.ReleaseComObject(Cipher) = 0 Then

            Exit Do

        End If

    Loop

End If

 

 

แต่ใน .NET 2.0 นั้นเราสามารถสั่งเพียงครั้งเดียวด้วย

System.Runtime.InteropServices.Marshal.FinalReleaseComObject()

ง่าย ๆ ดังนี้

 
ตัวอย่าง
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Cipher)
 
 
 
เมื่อค่า Reference Count เป็น 0 COM object ก็จะถูกทำลายและคืนหน่วยความจำคืนแก่ระบบ  
จบละ  

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: