दिलचस्प पोस्ट
Size_t प्रिंट करने के लिए printf का उपयोग करने का सही तरीका क्या है? जावास्क्रिप्ट पद्धति श्रृंखला में इनपुट पैरामीटर कैसे भरा जाता है? NSURL कनेक्शन का समय समाप्त? PHP की मौत की सफेद स्क्रीन सेब वॉच पर हार्ट रेट डेटा ऑब्जेक्ट प्रॉपर्टी कैसे सेट करें (ऑब्जेक्ट की संपत्ति ..) को जावास्क्रिप्ट में स्ट्रिंग नेम दिया गया है? IE का पता लगाने के लिए Modernizr का उपयोग करने के लिए सही तरीका है? Google फ़ॉन्ट कैसे IE में काम करने के लिए? Android संपर्क सूची को कैसे कॉल करें? क्या कोई समझा सकता है async / await? ActiveRecord, has_many: through, और पोलीमॉर्फिक एसोसिएशन्स एंड्रॉइड एक्सएमएल डीओएम पार्सिंग में समान नाम टैग कैसे पार्स करना है थंबनेल छवि बनाएं संग्रह कैसे करता है। तालिका के अन्य नामों का प्रदर्शन कैसे प्रभावित होता है?

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 होना चाहिए।