अवैध क्रॉस थ्रेड ऑपरेशन अपवाद के लिए कोई समाधान?

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

क्या इसे रोकने का कोई तरीका है?

0
जोड़ा संपादित
विचारों: 1

5 उत्तर

आपको कुछ ऐसा करने में सक्षम होना चाहिए:

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

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

अद्यतन: असल में, मेरे आखिरी काम पर हमने ऐसा कुछ किया:

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

    // Regular handling code
}

जो कोड को मजबूत करने के लिए अन्य ब्लॉक और प्रकार की आवश्यकता को हटा देता है।

0
जोड़ा

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

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

public void DoDataBind()
{
    DataBind();
}

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

0
जोड़ा

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

आप मेरे कोड को वर्कर थ्रेड से कॉल करेंगे जैसे:

this.BindData.Invoke();

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

0
जोड़ा

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

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

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

0
जोड़ा

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

0
जोड़ा