2008-08-05 14 views
13

जब आप डेटा सी # में बांधते हैं, तो डेटा जो डेटा बदलता है, वह भी नियंत्रण को बदलने का कारण बनता है। लेकिन अगर यह धागा वह नहीं है जिस पर नियंत्रण बनाया गया था, तो आपको एक अवैध क्रॉस थ्रेड ऑपरेशन अपवाद मिलेगा।अवैध क्रॉस थ्रेड ऑपरेशन अपवाद के लिए कोई समाधान?

क्या इसे रोकने के लिए वैसे भी है?

उत्तर

3

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

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

आप केवल कदम कोड है कि प्रतिनिधि समारोह में डेटा में परिवर्तन (क्योंकि डेटा परिवर्तन क्या नियंत्रण अद्यतन ट्रिगर करता है) करना होगा। इसके अलावा, आपको कुछ भी अतिरिक्त लिखना नहीं चाहिए।

3

आप की तरह कुछ करने के लिए सक्षम होना चाहिए:

if (control.InvokeRequired) 
{ 
    control.Invoke(delegateWithMyCode); 
} 
else 
{ 
    delegateWithMyCode(); 
} 

InvokeRequired नियंत्रण पर एक संपत्ति अगर आप सही धागे पर कर रहे हैं देखने के लिए है, तो आह्वान सही धागे पर प्रतिनिधि आह्वान करेंगे।

अद्यतन:

private void SomeEventHandler(Object someParam) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam); 
    } 

    // Regular handling code 
} 

जो और बाकी ब्लॉक के लिए की जरूरत को हटा तरह का कोड को मजबूत: असल में, मेरा आखिरी काम में हम कुछ इस तरह से किया था।

1

क्योंकि मेरे पास कोई परीक्षण केस नहीं है, इसलिए मैं इस समाधान की गारंटी नहीं दे सकता, लेकिन ऐसा लगता है कि अलग-अलग धागे (एक प्रतिनिधि का उपयोग करें) में प्रगति सलाखों को अपडेट करने के लिए इस्तेमाल किया जाने वाला एक परिदृश्य यहाँ उपयुक्त हो।

public delegate void DataBindDelegate(); 
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind); 

public void DoDataBind() 
{ 
    DataBind(); 
} 

यदि डेटा बाध्यकारी किसी विशेष थ्रेड द्वारा किया जाना आवश्यक है, तो उस थ्रेड को काम करने दें!

0

यदि थ्रेड कॉल "अवैध" है (यानी डेटाबिंड कॉल उस नियंत्रण को प्रभावित करता है जो थ्रेड में नहीं बनाया गया था जिसे इसे से बुलाया जा रहा है) तो आपको एक प्रतिनिधि बनाना होगा ताकि डेटाबंड के लिए निर्णय/तैयारी नियंत्रण-निर्माण धागे में नहीं किया जाता है, उनमें से कोई भी परिणामस्वरूप संशोधन (यानी डेटाबिंड()) होगा।

तुम इतनी तरह कार्यकर्ता धागे से मेरी कोड कहेंगे:

this.BindData.Invoke(); 

यह तो मूल थ्रेड बंधन है, जो करने के लिए कारण होगा काम करना चाहिए (यह मानते हुए धागा कि नियंत्रण बनाया है)।

0

डब्ल्यूपीएफ और सिल्वरलाइट में बाध्यकारी आधारभूत संरचना यूआई थ्रेड पर स्विचिंग का ख्याल रखती है।

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