नहीं मिलता है मैं एक BackgroundWorker का उपयोग करें और यह करते हैं:क्यों मैं "क्रॉस-धागा आपरेशन मान्य नहीं है" त्रुटि
private void loadNewAsyncToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Text = "RunWorkerAsync()";
backgroundWorkerLoading.RunWorkerAsync();
}
private void backgroundWorkerLoading_DoWork(object sender, DoWorkEventArgs e)
{
UnsafeThreadMethod("hello");
EvenUnsaferThreadMethod();
}
और अब दो तरीकों।
private void UnsafeThreadMethod(string text)
{
toolStripLabelRssFeedData.Text = text;
}
private void EvenUnsaferThreadMethod()
{
panelLoading.Visible = true;
}
मुझे समझ नहीं आता क्यों UnsafeThreadMethod
निम्न अपवाद फेंक नहीं है लेकिन EvenUnsaferThreadMethod
करता है।
क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है: नियंत्रण 'पैनल लोडिंग' को उस धागे के अलावा किसी अन्य धागे से एक्सेस किया गया था जिसे नियंत्रित किया गया था।
संदेश के मुताबिक ऐसा इसलिए है क्योंकि toolStripLabelRssFeedData
उसी धागे पर बनाया गया था लेकिन यह नहीं था।
मैंने सोचा कि मैं मुख्य धागे द्वारा बनाए गए नियंत्रणों को कॉल नहीं कर सकता और ProgressChanged
ईवेंट का उपयोग करना होगा। क्या चल रहा है?
और मेरे पास दूसरा प्रश्न है। जब मैं ProgressChanged
का उपयोग कर सकता हूं तो ऐसा करने का क्या फायदा है? मुझे क्या करना चाहिए?
private void EvenUnsaferThreadMethod()
{
if (panelLoading.InvokeRequired)
{
panelLoading.Invoke(new MethodInvoker(() => { EvenUnsaferThreadMethod(); }));
}
else
{
panelLoading.Visible = true;
}
}
के बाद लेबल पर अपनी राय देने के लिए अपना जवाब अपडेट किया। मुझे लगता है कि यह उत्तर बताता है कि ओपी क्या पूछ रहा था, यही कारण है कि स्पष्ट रूप से असुरक्षित कॉल अपवाद नहीं फेंक रहा था। यह सब इस तथ्य के चारों ओर घूमता है कि ToolStripLabel नियंत्रण से प्राप्त नहीं होता है और थ्रेड सुरक्षा की जांच नहीं कर रहा है। यह सिर्फ काम करने के लिए होता है, लेकिन जैसा कि दूसरे ने इंगित किया है, आप उस पर भरोसा नहीं कर सकते कि हमेशा के लिए सच्चे रहें। –