दिलचस्प पोस्ट
ASP.NET MVC – यूआरएल से नियंत्रक नाम को हटाने जावा में डबल प्रारूप करने के लिए String.format () परिपत्र आकृति में एक छवि दृश्य कैसे बनाएं? .htaccess के साथ छवि हॉटलिंकिंग की अनुमति दें / अस्वीकार करें बिना एंटिलाइज़िंग वाले चित्रों को कैसे फैलाना Liskov प्रतिस्थापन सिद्धांत का एक उदाहरण क्या है? अपवाद पकड़ो जिसे अलग थ्रेड में फेंका गया है क्या यूनिटऑफवर्क और जेनेरिक रिपोजिटरी पैटर्न बेमानी ईएफ 4.1 कोड में पहले है? पता लगाएँ कि ब्राउज़र टैब सक्रिय है या उपयोगकर्ता ने स्विच किया है स्विफ्ट 2: कॉल फेंक सकता है, लेकिन यह 'कोशिश' के साथ चिह्नित नहीं है और त्रुटि का संचालन नहीं किया गया है कोर डंप फ़ाइल विश्लेषण कैसे तेजी से एक JSON फ़ाइल पार्स करने के लिए? WPF में रेडियो बटन की तरह कार्य करने के लिए टॉगल बटन के समूह को कैसे प्राप्त करें? Google Play सेवाओं के साथ एंड्रॉइड स्टूडियो सभी प्रकार के व्युत्पन्न प्रकार प्राप्त करें

WPF छवि लोड async करें

मैं Gravatar-Images को लोड करना चाहूंगा और उन्हें कोड से पीछे WPF छवि नियंत्रण में सेट करना चाहूंगा। तो कोड ऐसा दिखता है

imgGravatar.Source = GetGravatarImage(email); 

कहाँ GetGravatar छवि की तरह लग रहा है:

 BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.UriSource = new Uri( GravatarImage.GetURL( "http://www.gravatar.com/avatar.php?gravatar_id=" + email) , UriKind.Absolute ); bi.EndInit(); return bi; 

दुर्भाग्य से यह नेटवर्क कनेक्शन धीमा है जब GUI ताले। क्या छवि-स्रोत को निर्दिष्ट करने और UI को अवरुद्ध किए बिना पृष्ठभूमि में छवि को लोड करने का एक तरीका है?

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "WPF छवि लोड async करें"

मैं आपको XAML से अपने imgGravatar पर एक बाध्यकारी का उपयोग करने का सुझाव देता हूं। IsAsync = इसे पर सेट करें और WPF स्वचालित रूप से आपकी छवि खींचने के लिए थ्रेड पूल से एक धागे का उपयोग करेगा। आप एक IValueConverter में हल तर्क को समापित कर सकते हैं और बस स्रोत के रूप में ईमेल को बाइंड कर सकते हैं

एक्सएएमएल में:

 <Window.Resouces> <local:ImgConverter x:Key="imgConverter" /> </Window.Resource> ... <Image x:Name="imgGravatar" Source="{Binding Path=Email, Converter={StaticResource imgConverter}, IsAsync=true}" /> 

कोड में:

 public class ImgConverter : IValueConverter { public override object Convert(object value, ...) { if (value != null) { BitmapImage bi = new BitmapImage(); bi.BeginInit(); bi.UriSource = new Uri( GravatarImage.GetURL( "http://www.gravatar.com/avatar.php?gravatar_id=" + value.ToString()) , UriKind.Absolute ); bi.EndInit(); return bi; } else { return null; } } } 

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

फिर भी, निम्न कोड छवि को पूरी तरह से एक अलग धागे ( ThreadPool ) में डाउनलोड और बनाने के लिए एक सरल तरीका दिखाता है। उस बफ़र से एक WebClient इमेज बनाने से पहले, संपूर्ण इमेज बफर को डाउनलोड करने के लिए एक वेब WebClient इंस्टेंस का उपयोग किया जाता है। बिटमैप इमेज बनने के बाद इसे यूआई थ्रेड से इसे सुलभ बनाने के लिए Freeze कहते हैं। अंत में यह आईआईओ थ्रेड में Dispatcher.BeginInvoke माध्यम से छवि नियंत्रण की Source प्रॉपर्टी को निर्दिष्ट करती है।

 ThreadPool.QueueUserWorkItem( o => { var webClient = new WebClient(); var url = GravatarImage.GetURL("http://www.gravatar.com/avatar.php?gravatar_id=" + email); var buffer = webClient.DownloadData(url); var bitmapImage = new BitmapImage(); using (var stream = new MemoryStream(buffer)) { bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.StreamSource = stream; bitmapImage.EndInit(); bitmapImage.Freeze(); } Dispatcher.BeginInvoke((Action)(() => image.Source = bitmapImage)); }); 

आप इस प्रश्न पर एक नज़र डालना चाहते हैं:

संपर्क

और मैं एक asynchrone कार्य को स्टार्टअप करने की सलाह देता हूं, और उस कोड को लगाता है जो उस कार्य में async होना चाहिए।