2010-11-26 15 views
6

मैं जांच कर रहा हूं कि मेरे कुछ नियंत्रण कचरा नहीं जा रहे हैं और ध्यान दिया गया है कि कंटेंटकंट्रोल से कभी भी नष्ट होने से प्राप्त सरल नियंत्रण को रोकना आसान है।सिल्वरलाइट कंटेंट कंट्रोल्स कचरा क्यों नहीं एकत्रित किया जाता है?

public class MyCustomControl : ContentControl 
{ 

    public MyCustomControl() 
    { 
     Debug.WriteLine("Constructed"); 
    } 

    ~MyCustomControl() 
    { 
     Debug.WriteLine("Destroyed"); 
    } 
} 

अब अगर मैं इतना की तरह एक पेज पर डाल दिया:

public partial class CustomControl : Page 
{ 
    public CustomControl() 
    { 
     InitializeComponent(); 

     this.DataContext = new CustomControlViewModel(); 

     this.Unloaded += new RoutedEventHandler(OnUnloaded); 
    } 

    void OnUnloaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = null; 
    } 

    // Executes when the user navigates to this page. 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 



} 
:

<navigation:Page x:Class="SimpleTestBed.Views.CustomControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
      xmlns:local="clr-namespace:SimpleTestBed" 
     d:DesignWidth="640" d:DesignHeight="480" 
     Title="CustomControl Page"> 
<Grid x:Name="LayoutRoot"> 

    <StackPanel> 
     <local:MyCustomControl> 
      <TextBox Text="{Binding SomeProperty,Mode=TwoWay}"></TextBox> 
     </local:MyCustomControl> 
    </StackPanel> 

</Grid> 

पीछे निम्न कोड के साथ

यहाँ मेरी कस्टम ContentControl है: यहाँ एक उदाहरण है

तब दृश्य मॉडल है:

public class CustomControlViewModel : INotifyPropertyChanged 
{ 

    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     RaisePropertyChanged(propertyName); 
    } 
    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 


    private string _someProperty = "Initial Value"; 
    public string SomeProperty 
    { 
     get { return _someProperty; } 
     set 
     { 
      if (_someProperty != value) 
      { 
       string oldValue = _someProperty; 
       _someProperty = value; 
       OnPropertyChanged("SomeProperty"); 
       OnSomePropertyChanged(oldValue, value); 
      } 
     } 
    } 



    protected virtual void OnSomePropertyChanged(string oldValue, string newValue) 
    { 

    } 


} 

अब जब मैं इस पृष्ठ से दूर नेविगेट करता हूं और जीसी.कोलेक्ट() के साथ कचरा इकट्ठा करने का प्रयास करता हूं, तब तक जब तक मैंने टेक्स्टबॉक्स में टेक्स्ट में कोई बदलाव नहीं किया है, तो ContentControl और Page द्वारा अपेक्षित के रूप में नष्ट हो जाते हैं जीसी लेकिन अगर मैंने कुछ पाठ संपादित किया है और पृष्ठ से दूर नेविगेट किया है और फिर जीसी.कोलेक्ट() की कोशिश की है, तो कंटेंटकंट्रोल को कचरा नहीं मिला है।

क्या कोई इस व्यवहार को समझा सकता है?

असल में, आप जब आप उतारना नियंत्रण से खाका 'झिलमिलाते' द्वारा नियंत्रण इकट्ठा करने के लिए मजबूर कर सकते हैं जीसी:

void MyCustomControl_Unloaded(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("MyCustomControl Unloaded"); 
     ControlTemplate oldTemplate = this.Template; 
     this.Template = null; 
     this.Template = oldTemplate; 
    } 

मुझे लगता है इस वर्तमान दृश्य पेड़ पेड़ का पहला घटक के संदर्भ खोने नष्ट कर देता है अपने माता-पिता (कस्टम नियंत्रण) के लिए। नियंत्रण को फिर से लोड होने पर यह निश्चित रूप से ऑनएप्ली टेम्पलेट को याद करने के लिए नियंत्रण को मजबूर करता है।

इस लीक के बिना Silverlight नियंत्रण के विकास के लिए सही पद्धति है? यदि ऐसा है, तो यह मुझे थोड़ा विचित्र के रूप में हमला करता है कि नियंत्रण अनलोड होने पर टेम्पलेट स्वचालित रूप से डिस्पोजेक्ट नहीं किया जाता है।

इस व्यवहार का एक अच्छा खाता बहुत सराहना की जाएगी क्योंकि यह सिल्वरलाइट नियंत्रण के जीवन चक्र के दिल के लिए सही है।

उत्तर

-1

मेरा अनुभव से पता चला है कि Silverlight में मेमोरी लीक शीर्ष 2 वजह से coused रहे हैं:

  • घटनाक्रम => है कि आप संलग्न घटनाओं एक बार जब यह आवश्यक नहीं है या वर्ग नाशक में अवश्य निकाल दें।
  • टेम्पलेट्स => समाधान संसाधन अनुभाग
+0

में टेम्पलेट परिभाषित करें आपका उत्तर प्रासंगिक क्यों है? ऐसा लगता है कि ओपी पर लागू नहीं होता है –

संबंधित मुद्दे