मेरा एक परिदृश्य है। (विंडोज फॉर्म, C #, .NET)
- एक मुख्य रूप है जो कुछ उपयोगकर्ता नियंत्रण को होस्ट करता है।
- उपयोगकर्ता नियंत्रण कुछ भारी डेटा ऑपरेशन करता है, जैसे कि अगर मैं सीधे
UserControl_Load
विधि को कॉल करता हूं तो UI लोड विधि के निष्पादन के लिए अवधि के लिए गैर-जिम्मेदार हो जाता है। - इसे दूर करने के लिए मैं विभिन्न थ्रेड पर डेटा लोड करता हूं (मौजूदा कोड को जितना हो सके बदलने की कोशिश कर रहा हूं)
- मैंने एक बैकग्राउंड वर्कर थ्रेड का उपयोग किया था जो डेटा लोड कर रहा होगा और जब किया जाएगा तो उस एप्लिकेशन को सूचित करेगा कि इसने अपना काम किया है।
- अब असली समस्या आई। सभी यूआई (मुख्य रूप और इसके बच्चे usercontrols) को प्राथमिक मुख्य धागे पर बनाया गया था। Usercontrol के LOAD विधि में मैं userControl पर कुछ नियंत्रण (जैसे टेक्स्टबॉक्स) के मूल्यों के आधार पर डेटा प्राप्त कर रहा हूं।
स्यूडोकोड इस तरह दिखेगा:
कोड १
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
यह दिया गया अपवाद था
क्रॉस-थ्रेड ऑपरेशन मान्य नहीं: जिस थ्रेड पर यह बनाया गया था, उसके अलावा किसी थ्रेड से एक्सेस कंट्रोल।
इसके बारे में अधिक जानने के लिए मैंने कुछ काम किया और निम्नलिखित कोड का उपयोग करने जैसा एक सुझाव आया
CODE 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
लेकिन मुझे लगता है ... मैं एक वर्ग में वापस आ रहा हूँ लगता है। एप्लिकेशन फिर से गैर-जिम्मेदार हो जाता है। ऐसा लगता है अगर हालत # 1 # लाइन के निष्पादन के कारण होता है। लोडिंग कार्य फिर से पैरेंट थ्रेड द्वारा किया जाता है, न कि तीसरा जिसे मैंने देखा।
मुझे नहीं पता कि मुझे यह सही लगता है या गलत। मैं थ्रेडिंग में नया हूं।
मैं इसे कैसे हल करूं और यह भी बताएं कि यदि ब्लॉक # 1 लाइन के निष्पादन का प्रभाव क्या है?
स्थिति यह है : मैं एक नियंत्रण के मूल्य के आधार पर एक वैश्विक चर में डेटा लोड करना चाहता हूं। मैं बच्चे के धागे से नियंत्रण के मूल्य को बदलना नहीं चाहता। मैं इसे एक बच्चे के धागे से कभी नहीं करने जा रहा हूं।
इसलिए केवल मान को एक्सेस करना ताकि डेटाबेस से संबंधित डेटा प्राप्त किया जा सके।