2011-11-03 20 views
5

मेरे पास एक wpf प्रोजेक्ट है जहां मैं INotifyProperty का उपयोग कर रहा हूं उस संपत्ति पर बदल दिया गया जो टेक्स्टबॉक्स से जुड़ा हुआ है। मैं इस मान को कार्य (TaskParallelLibrary) का उपयोग करके एक अलग धागे पर अद्यतन कर रहा हूं। यह ठीक से अद्यतन किया गया है और एक अपवाद फेंक नहीं है। मैं सोच रहा था कि यह एक अपवाद फेंक देगा क्योंकि यह पृष्ठभूमि धागे पर चल रहा है और यूआई थ्रेड नहीं है। अगर मैं यूआई तत्व का सीधे उपयोग करता हूं तो यह अपवाद फेंक रहा है। तो, क्या INotifyPropertyChanged बाध्य तंत्र स्वचालित रूप से UI थ्रेड को प्रेषण का ख्याल रखता है?कार्य समानांतर लाइब्रेरी INotifyProperty ने अपवाद फेंक दिया नहीं?

यहां संपत्ति के साथ मेरा कोड है।

private string _textProperty = ""; 
    public string TextProperty 
    { 
     get 
     { 
      return _textProperty; 
     } 
     set 
     { 
      if (_textProperty != value) 
      { 
       _textProperty = value; 
       NotifyPropertyChanged("TextProperty"); 
      } 
     } 
    } 

और मेरे कार्य निर्माण

var task = new Task(() => 
     { 
      TextProperty = "ABCD"; // Works. 
      // txtBox.Text = "ABCD"; // Throws an exception. 
     }); 
     task.Start(); 

है और XAML में पाठ बॉक्स <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

उत्तर

6

मैं सोच रहा था, क्योंकि यह एक पृष्ठभूमि धागे पर नहीं चल रहा है और यूआई धागा है यह एक अपवाद फेंक होगा।

डब्ल्यूपीएफ आपको पृष्ठभूमि धागे पर एक बाध्य मूल्य निर्धारित करने की अनुमति देता है। यह आपके लिए यूआई थ्रेड के लिए मार्शलिंग को संभालेगा।

ध्यान रखें, हालांकि, यह संग्रह के तत्वों के लिए काम करता है। यदि आप ObservableCollection<T> में जोड़ना चाहते हैं जो बाध्य है, उदाहरण के लिए, आपको UI थ्रेड पर वापस मार्शल करना होगा। various workarounds हैं, हालांकि, यदि आवश्यक हो तो इसे कम कर सकते हैं। ध्यान दें कि this behavior changes in WPF 4.5, जो भविष्य में डब्ल्यूपीएफ में बहुप्रचारित विकास को सरल बना देगा।

+1

+1। WPF 4.5 के लिए दिलचस्प लिंक। ऐसा लगता है कि उन्होंने कुछ चीजें हल की हैं जिन्हें मैं वर्तमान में डब्ल्यूपीएफ के बारे में नापसंद करता हूं। – RichardOD

+0

@Reed क्या आपके पास संदर्भ है कि wpf मार्शल आपके लिए अपडेट कैसे करता है? –

1

एकल गुणों के बाइंडिंग affine थ्रेड नहीं है। आप बिना किसी समस्या के ऐसा कर सकते हैं, बाध्यकारी आपके लिए आवश्यक होगा।
हालांकि ध्यान रखें, यह केवल एकल संपत्ति बाइंडिंग के लिए है। यदि आपके पास उदाहरण के लिए एक अवलोकन योग्य चयन है, तो आप बाध्यकारी के माध्यम से बाध्य होने के बावजूद, किसी अन्य थ्रेड से आइटम जोड़ या हटा नहीं सकते हैं!

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