2012-09-25 12 views
6

में छवियों को लोड करना मैं पिछले कुछ दिनों में पृष्ठभूमि वर्कर के साथ किसी समस्या से निपट रहा हूं। मैं एमएसडीएन पर मंचों और दस्तावेजों के माध्यम से देख रहा हूं लेकिन अभी भी जवाब नहीं मिला है इसलिए अब मैं आपको चालाक लोगों से पूछना चाहता हूं।BackgroundWorker

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

class PictureThumbnail : INotifyingWrapPanelElement 
{ 
    private string path; 
    private Grid grid = null; 

    private BackgroundWorker thumbnailBackgroundCreator = new BackgroundWorker(); 
    private delegate void GUIDelegate(); 
    private Image thumbnailImage = null; 

    public PictureThumbnail(String path) 
    { 
     this.path = path; 
     visible = false; 
     thumbnailBackgroundCreator.DoWork += new DoWorkEventHandler(thumbnailBackgroundCreator_DoWork); 

    } 

    void thumbnailBackgroundCreator_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BitmapImage bi = LoadThumbnail(); 
     bi.Freeze(); //If i dont freeze bi then i wont be able to access 

     GUIDelegate UpdateProgressBar = delegate 
     { 
      //If this line is commented out the GUI does not stall. So it is not the actual loading of the BitmapImage that makes the GUI stall. 
      thumbnailImage.Source = bi; 
     }; 
     grid.Dispatcher.BeginInvoke(UpdateProgressBar); 
    } 


    public void OnVisibilityGained(Dispatcher dispatcher) 
    { 
     visible = true; 
     thumbnailImage = new Image(); 
     thumbnailImage.Width = 75; 
     thumbnailImage.Height = 75; 

     //I tried setting the thumbnailImage.Source to some static BitmapImage here, and that does not make the GUI stall. So it is only when it is done through the GUIDelegate for some reason. 
     grid.Children.Add(thumbnailImage); 
     thumbnailBackgroundCreator.RunWorkerAsync(); 
    } 



    private BitmapImage LoadThumbnail() 
    { 
     BitmapImage bitmapImage = new BitmapImage(); 

     // BitmapImage.UriSource must be in a BeginInit/EndInit block 
     bitmapImage.BeginInit(); 
     bitmapImage.UriSource = new Uri(path); 
     bitmapImage.DecodePixelWidth = 75; 
     bitmapImage.DecodePixelHeight = 75; 
     bitmapImage.EndInit(); 

     return bitmapImage; 
    } 
} 

मैं कुछ सामान मैंने कोशिश की है और क्या ले जाता है मैं समझा कोड में कुछ टिप्पणियाँ जोड़ लिया है: इस वर्ग कि WrapPanel में निहित तत्वों का प्रतिनिधित्व करता है के लिए कोड है। लेकिन मैं इसे फिर से लिखूंगा। अगर मैं बैकमैप इमेज को पृष्ठभूमि वर्कर में लोड करता हूं, लेकिन इसे थंबनेल के स्रोत के रूप में लागू नहीं करता हूं तो जीयूआई स्टॉल नहीं करता है (लेकिन कोई छवि स्पष्ट रूप से प्रदर्शित नहीं होती है)। इसके अलावा अगर मैंने थंबनेल इमेज का स्रोत कुछ प्रीलोड किए गए स्थिर बिटमैप इमेज को ऑनविज़िबिलिटी प्राप्त विधि (इसलिए जीयूआई थ्रेड में) में सेट किया है, तो जीयूआई स्टॉल नहीं होगा, इसलिए यह छवि की वास्तविक सेटिंग नहीं है। स्रोत जो कि अपराधी है।

+0

[लोड हो रहा है छवि लोड हो रहा है] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/12103884/loading-image-stops-issue) –

+0

यह स्टाल करता है क्योंकि थंबनेल इमेज आपके थ्रेड से अपडेट किया गया है। आईडी सुझाव देता है कि अगर आपके पास अपडेट इमेज (बिटमैप इमेज i) था, यदि आपने इसे बाय वैरिएबल के साथ बुलाया है, तो यह बंद हो जाएगा। – BugFinder

+1

@ जेसन, जो विवरण का विवरण है कि समाधान पृष्ठभूमिवर्कर का उपयोग करना है, यह प्रश्न BackgroundWorker का उपयोग कर समस्याओं का विवरण दे रहा है। स्पष्ट रूप से BackgroundWorker के साथ समस्याओं का उत्तर BackgroundWorker का उपयोग नहीं कर सकता है। –

उत्तर

1

आपको पृष्ठभूमि कार्यकर्ता की रिपोर्टिंग सुविधा का उपयोग करना चाहिए जो आपको बिना किसी आमंत्रण के सीधे आपके फॉर्म के नियंत्रण तक पहुंचने देता है।

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