หน่วยความจำรั่วอาจเกิดขึ้นเมื่อคุณใช้การรวมข้อมูลใน Windows มูลฐานการนำเสนอ

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 938416 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อคุณใช้การรวมข้อมูลใน Microsoft Windows งานนำเสนอมูลฐาน (WPF), หน่วยความจำรั่วอาจเกิดขึ้น

สาเหตุ

ปัญหานี้จะเกิดขึ้นหากเงื่อนไขต่อไปนี้เป็นจริง::
  • เส้นทางของการผูกข้อมูลอ้างอิงถึงคุณสมบัติpของวัตถุx.
  • วัตถุxประกอบด้วยการอ้างอิงโดยตรงหรือมีการอ้างอิงไปยังเป้าหมายของการดำเนินการผูกข้อมูลทางอ้อม
  • คุณสมบัติpเข้าถึงผ่านทางการPropertyDescriptorวัตถุแทนDependencyPropertyวัตถุ หรือยังPropertyInfoวัตถุ

การหลีกเลี่ยงปัญหา

ถ้าต้องการหลีกเลี่ยงปัญหานี้ ใช้วิธีการใดวิธีการหนึ่งต่อไปนี้:

วิธีที่ 1:

คุณสมบัติการเข้าถึงpผ่านทางการDependencyPropertyวัตถุ

วิธีที่ 2

แสดงถึงINotifyPropertyChangedอินเทอร์เฟซบนวัตถุx.

วิธีที่ 3

ตั้งค่าโหมดของการรวมข้อมูลไปoneTime.

สถานะ

ลักษณะการทำงานนี้เกิดจากการออกแบบ

ข้อมูลเพิ่มเติม

ใน WPF การดำเนินการผูกข้อมูลที่ไม่ได้ถูกทำเครื่องหมายเป็นoneTimeต้องฟังสำหรับการแจ้งเตือนการเปลี่ยนแปลงคุณสมบัติจากวัตถุต้นทาง (วัตถุx). WPF ใช้การแจ้งเตือนของอยู่แล้วภายในนั้นDependencyPropertiesคลาหรือการแจ้งเตือนจากนั้นINotifyPropertyChangedอินเทอร์เฟซ

ถ้าการDependencyPropertiesคลาและINotifyPropertyChangedอินเทอร์เฟซที่ไม่มี WPF ใช้นั้นValueChangedเหตุการณ์ โทรศัพท์ที่เกี่ยวข้องกับลักษณะการทำงานนี้PropertyDescriptor.AddValueChangedวิธีในการPropertyDescriptorวัตถุที่สอดคล้องกับคุณสมบัติp. แต่ดำเนินการนี้ทำให้รันไทม์ทั่วไปของภาษา (CLR) เพื่อสร้างการอ้างอิงที่แน่นหนาจากนี้PropertyDescriptorวัตถุกับวัตถุx. CLR เก็บการอ้างอิงไปยังPropertyDescriptorวัตถุในตารางส่วนกลาง ลักษณะการทำงานนี้ทำให้กลุ่มข้อมูลอ้างอิงเกิดขึ้นในลำดับต่อไปนี้:
  1. ตารางทั้งหมด
  2. กระบวนการPropertyDescriptorวัตถุ
  3. วัตถุx
  4. เป้าหมายของการผูกข้อมูล

    หมายเหตุ:การอ้างอิงระหว่างวัตถุ X และเป้าหมายของการผูกข้อมูลมีสาเหตุจากเงื่อนไขแรกที่แสดงไว้ในส่วน "สาเหตุ"
  5. การผูก
ตราบเท่าที่จะใช้เป้าหมายของการผูกข้อมูล การรวมต้องดำเนินการฟังการเปลี่ยนแปลง ลักษณะการทำงานนี้เก็บข้อมูลอ้างอิง alive ระหว่างPropertyDescriptorวัตถุและวัตถุxและเป้าหมายยังคงใช้งาน ลักษณะการทำงานนี้ทำให้หน่วยความจำรั่วในวัตถุxและ ในทุกวัตถุไปที่วัตถุxการอ้างอิงถึง วัตถุเหล่านี้รวมถึงเป้าหมายของการผูกข้อมูล

วิธีการแก้ปัญหา 1 และวิธีการแก้ปัญหา 2 ก่อให้เกิด WPF ใช้กลไกการแจ้งเตือนที่ต้องการอย่างใดอย่างหนึ่ง วิธีการแก้ปัญหา 3 WPF ไม่ให้รับการแจ้งเตือนการเปลี่ยนแปลงที่แนะนำให้ วิธีการแก้ปัญหาสามทั้งหมดหลีกเลี่ยงการสร้างการอ้างอิงระหว่างPropertyDescriptorวัตถุและวัตถุx.

ในอย่างต่อไปนี้ของรหัส เงื่อนไขสำหรับการรั่วไหลถูกสร้าง
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
ในตัวอย่างนี้รหัส การจำนวนครั้งคุณสมบัติแทนคุณสมบัติp. นอกจากนี้ วัตถุxแสดงโดยUIElementCollectionคลาในรูปแบบของStackPanel.Childrenคุณสมบัติ

ตามเงื่อนไขแรกในส่วน "การทำให้เกิด" ได้เนื่องจากวัตถุxอ้างอิงถึงลูกของวัตถุx. ลูกเหล่านี้รวมถึงเป้าหมายของการผูก และเป้าหมายของการผูกTextBlockองค์ประกอบ

ตามเงื่อนไขที่สองในส่วน "การทำให้เกิด" ได้เนื่องจากคุณสมบัติpไม่มีDependencyPropertyวัตถุ และวัตถุxไม่นำมาใช้ในINotifyPropertyChangedอินเทอร์เฟซ ลักษณะการทำงานนี้ทำให้การUIElementCollectionคลาและTextBlockองค์ประกอบไม่ให้มีการนำออกใช้ นอกจากนี้StackPanelคลาคอนเทนเนอร์จะไม่นำออกใช้ เนื่องจากการUIElementCollectionคลาสที่ประกอบด้วยการอ้างอิงไปยังStackPanelคลาคอนเทนเนอร์ ลักษณะการทำงานนี้เกิดขึ้นแม้ว่าการUIElementCollectionคลาและTextBlockองค์ประกอบที่จะถูกเอาออกจากแผนภูมิหลัก โดยใช้บรรทัดของรหัสต่อไปนี้:
MyLabel.Content = <Some New Content>;

คุณสมบัติ

หมายเลขบทความ (Article ID): 938416 - รีวิวครั้งสุดท้าย: 20 ตุลาคม 2553 - Revision: 2.0
ใช้กับ
  • Microsoft .NET Framework 3.0
Keywords: 
kbtshoot kbprb kbmt KB938416 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:938416

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com