วัตถุ FileStream (.NETCF, C#) ที่สร้างขึ้นโดยใช้ตัวจัดการที่ส่งคืนจาก Win32 API CreateFile (C ++, P / Invoke) มีแนวโน้มที่จะเป็น. NET Garbage Collection

คำถามที่อัปเดต

เนื่องจาก .NETCF ไม่รองรับ ctor (public FileStream (ตัวจัดการ IntPtr, การเข้าถึง FileAccess) คุณช่วยแนะนำวิธีอื่นในการแชร์ไฟล์ขนาดใหญ่ในหน่วยความจำระหว่างโค้ดที่ได้รับการจัดการและไม่ได้รับการจัดการบนแพลตฟอร์มทรัพยากร (RAM) ที่จำกัด โดยพื้นฐานแล้วฉันต้องการ แมปไฟล์ในพื้นที่ด้านบนของพื้นที่ผู้ใช้ 2GB (Win CE 5.0) นอกพื้นที่กระบวนการ / ฮีป ฉันจะทำสิ่งนั้นใน C # ได้อย่างไร

นอกจากนี้วัตถุ MemoryStream จะจัดสรรพื้นที่ในฮีปหรือในพื้นที่ที่แมปหน่วยความจำบน Win CE 5.0 หรือไม่

ขอบคุณ...

คำถามเดิม

ฉันกำลังสร้างอินสแตนซ์ FileStream Object (.NETCF , C#) โดยใช้ตัวจัดการไฟล์ที่ส่งคืนโดย CreateFile() ดั้งเดิมดังต่อไปนี้:

    //P/Invoke    
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern IntPtr CreateFile(string lpFileName,
                                            uint dwDesiredAccess,
                                            uint dwShareMode,
                                            IntPtr lpSecurityAttributes,
                                            uint dwCreationDisposition,
                                            uint dwFlagsAndAttributes,
                                            IntPtr hTemplateFile);
// File handle received from native Win32 API
IntPtr ptr= CreateFile("myfile.txt",
                         0,
                         0,
                         0,
                         FileMode.Create,
                         0, 
                         IntPtr.Zero);

//Instantiate a FileStream object using handle (returned above) as parameter.
FileStream fs = new FileStream(ptr,FileAccess.ReadWrite);

ไฟล์จะขยายเป็นขนาดใหญ่ > 500 KB หรือมากกว่า ดังนั้นคำถามของฉันคือ:

*1) มีอะไรผิดปกติกับวิธีการนี้หรือไม่ เนื่องจากคุณสมบัติ SafeFileHandle / Handle ไม่ได้รับการสนับสนุนในเวอร์ชัน .NETCF มีวิธีอื่นที่ดีกว่านี้หรือไม่ (ฉันกำลังวางแผนที่จะใช้ตัวจัดการไฟล์ที่แมปหน่วยความจำดั้งเดิมกับ FileStream / MemoryStream)

2) หน่วยความจำที่จัดสรรโดยวัตถุ FileStream อยู่ภายใต้ตัวรวบรวมขยะ .NETCF หรือไม่ หรือเนื่องจากหมายเลขอ้างอิงนั้นเป็นไฟล์ที่แมปหน่วยความจำที่สร้างขึ้นโดยใช้ API ดั้งเดิม มัน (ออบเจ็กต์ FileStream ที่ได้รับการจัดการและทรัพยากรของมัน) อยู่นอกขอบเขตของตัวรวบรวมขยะ ?*

ขอบคุณล่วงหน้า.


person curiousone    schedule 28.06.2009    source แหล่งที่มา
comment
คุณควรเปิดคำถามใหม่และลิงก์ไปที่คำถามนี้เพื่อเป็นข้อมูลพื้นฐาน ด้วยวิธีนี้ผู้คนสามารถตอบคำถามได้ทีละคำถาม   -  person Lee    schedule 28.06.2009


คำตอบ (2)


โดยรวมแล้วไม่มีอะไรผิดปกติกับแนวทางการใช้ไฟล์ Create ดั้งเดิมและรวมไว้ในออบเจ็กต์ FileStream นี่เป็นคุณสมบัติที่รองรับของ FileStream

ในแง่ของการเก็บขยะแม้ว่าจะมี 2 สิ่งที่เล่นอยู่ที่นี่จริงๆ

  1. หน่วยความจำที่เกี่ยวข้องกับวัตถุ FileStream ใช่ นี่จะเป็นการเก็บขยะ
  2. หมายเลขอ้างอิงซึ่งเป็นทรัพยากรที่สร้างขึ้นด้วย CreateFile วัตถุ FileStream จะเป็นเจ้าของหมายเลขอ้างอิงนี้ และจะปล่อยมันเมื่อถูกกำจัด (แบบพาสซีฟหรือแบบแอคทีฟ)
person JaredPar    schedule 28.06.2009
comment
+1 หาก SafeFileHandle ที่ถูกส่งผ่านไปยังตัวสร้าง FileStream ถูกสร้างขึ้นโดยที่ ownsHandle ตั้งค่าเป็นเท็จ การกำจัดของ FileStream จะยังคงปิดหมายเลขอ้างอิงจาก CreateFile ที่ถูกส่งผ่านไปยังตัวสร้าง SafeFileHandle หรือไม่ ฉันลองมองตัวสะท้อนแสง แต่มันก็สับสนเล็กน้อย - person SwDevMan81; 17.12.2009

ตามเอกสาร ตัวสร้างที่คุณวางแผนจะใช้ไม่ใช่ ไม่สามารถใช้งานได้ใน .NET CF

person Lee    schedule 28.06.2009
comment
ขอบคุณ. ฉันไม่รู้ว่า ฉันขอถามคำถามอื่น แต่เกี่ยวข้องกัน ฉันจะแก้ไขคำถามข้างต้น - person curiousone; 28.06.2009