2013-08-21 8 views
6

जब भी मैं WriteableBitmap का कोई उदाहरण बनाता हूं तो मुझे मेमोरी लीक मिल रही है। मैंने स्टैक ओवरफ्लो और अन्य मंचों पर कई सुझावों का प्रयास किया है, लेकिन कुछ भी काम नहीं कर रहा है।विंडोज फोन में लिखने योग्य बिटमैप मेमोरी लीक 8

  1. एक WriteableBitmap बनाने के लिए PhotoResult वस्तु से PhotoChooserTask
  2. उपयोग Stream के साथ एक छवि का चयन करें: अपने परीक्षण एप्लिकेशन के बुनियादी प्रवाह यह है।

यही है। चर को कम करना और GC.Collect() पर कॉल करना केवल समस्या का हिस्सा हल करता है। यह एप को दुर्घटनाग्रस्त होने तक स्मृति आवंटित करने से रोकता है, लेकिन ऑब्जेक्ट्स गुंजाइश से बाहर हो गया है, फिर भी जब तक मैं एक नई छवि का चयन नहीं करता तब तक उनके लिए आवंटित स्मृति होती है। मैं इसे एक्सएएमएल ऐप के साथ डिफ़ॉल्ट विंडोज फोन डायरेक्ट 3 डी के साथ पुन: पेश कर सकता हूं। डिफ़ॉल्ट परियोजना के लिए केवल संशोधनों निम्नलिखित हैं:

MainPage.xaml.cs

public MainPage() { 
    InitializeComponent(); 
    _photoChooserTask = new PhotoChooserTask(); 
    _photoChooserTask.Completed += new EventHandler<PhotoResult>(photoChooserTaskComplete); 
} 

private void ApplicationBarIconButton_Click(object sender, EventArgs e) { 
    _photoChooserTask.Show(); 
} 

private void photoChooserTaskComplete(object sender, PhotoResult e) { 
    if (e.TaskResult == TaskResult.OK) { 
     BitmapImage image = new BitmapImage(); 
     image.SetSource(e.ChosenPhoto); 
     WriteableBitmap wbm = new WriteableBitmap(image); 
     image.UriSource = null; 
     image = null; 
     wbm = null; 
     GC.Collect(); 
    } 
} 

MainPage.xaml

<phone:PhoneApplicationPage.ApplicationBar> 
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Default" Opacity="0.5" > 
     <shell:ApplicationBar.Buttons> 
      <shell:ApplicationBarIconButton IconUri="/junkUrl.png" Text="albums" Click="ApplicationBarIconButton_Click" /> 
     </shell:ApplicationBar.Buttons> 
    </shell:ApplicationBar> 
</phone:PhoneApplicationPage.ApplicationBar> 
+0

हाय, मुझे इस समस्या का सामना करना पड़ा है, अभी तक कोई समाधान है? –

उत्तर

-1

इसके लिए आपको IsolatedStorege अंदर इस फाइल धारा स्टोर करने के लिए किया है। तो IsolatedStorageFileStream का उपयोग कर एक filestream बनाने और उसके बाद, उसे सहेजने के इस तरह ...

private void photoChooserTaskComplete(object sender, PhotoResult e) { 
if (e.TaskResult == TaskResult.OK) { 
     SaveToIsolatedStorage(e.ChosenPhoto,"Your File Name");   
} 

}

public void SaveToIsolatedStorage(Stream imageStream, string fileName) 
    { 
     try 
     { 
      string imagename = fileName + ".jpg"; 
      using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       if (myIsolatedStorage.FileExists(imagename)) 
       { 
        myIsolatedStorage.DeleteFile(imagename); 
       } 
       IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(imagename); 
       WriteableBitmap wb = new WriteableBitmap(100, 100); 
       wb.SetSource(imageStream); 
       wb.SaveJpeg(fileStream, 100, 100, 0, 70); 
       fileStream.Close(); 
      } 
     } 

     catch (Exception) 
     { 
      RadMessageBox.Show(String.Empty, MessageBoxButtons.OK, "Error occured while saving Images");        
     } 

    } 

और पढ़ने के लिए आप IsolatedStorage

से उस फ़ाइल को प्राप्त कर सकते हैं
public WriteableBitmap ReadFromIsolatedStorage(string fileName) 
    { 
     WriteableBitmap bitmap = new WriteableBitmap(100, 100); 
     try 
     { 
      using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       if (myIsolatedStorage.FileExists(fileName)) 
       { 

        using (IsolatedStorageFileStream fileStream = myIsolatedStorage.OpenFile(fileName, FileMode.Open, FileAccess.Read)) 
        { 
         // Decode the JPEG stream.        
         bitmap = PictureDecoder.DecodeJpeg(fileStream, 100, 100); 
        } 
       } 
      } 
     } 
     catch (Exception) 
     { 
      RadMessageBox.Show(String.Empty, MessageBoxButtons.OK, "Error Occcured while reading image");        
     } 


     return bitmap; 
    } 

हो जाएगा ताकि अपनी याददाश्त रिसाव की समस्या हल करें, इसे आजमाएं ...

+1

उपर्युक्त काम नहीं करता है। जैसा कि आपने निर्देश दिया है, मैंने इसे लागू किया है, लेकिन जब वस्तुएं गुंजाइश से बाहर होती हैं तो स्मृति कभी जारी नहीं होती है। प्रारंभिक स्ट्रीम से बनाया गया लिखने योग्य बिटमैप तब तक एकत्र नहीं किया जाता जब तक कि मैं एक और छवि चुनकर एक नई वस्तु नहीं बना देता। पृथक भंडारण से छवि को पढ़ना ठीक लगता है और अपेक्षित कचरा संग्रहण व्यवहार का पालन करता है। – Wagan8r

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