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

वोट
15

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

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

05/08/2008 को 08:45
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
3

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

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

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

05/08/2008 को 09:05
का स्रोत उपयोगकर्ता

वोट
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
}

जो और किसी और ब्लॉक के लिए की जरूरत को हटा तरह का कोड को मजबूत।

05/08/2008 को 08:51
का स्रोत उपयोगकर्ता

वोट
1

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

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

public void DoDataBind()
{
    DataBind();
}

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

05/08/2008 को 08:56
का स्रोत उपयोगकर्ता

वोट
0

WPF और Silverlight में बाध्यकारी बुनियादी ढांचे यूआई धागा करने के लिए स्विचन का ख्याल रखता है।

08/08/2008 को 17:19
का स्रोत उपयोगकर्ता

वोट
0

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

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

this.BindData.Invoke();

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

05/08/2008 को 09:06
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more