त्रुटि: "थ्रेड के अलावा किसी थ्रेड से एक्सेस किया गया था जिसे मैंने बनाया था" मैंने पृष्ठभूमिवर्कर का उपयोग किया और अभी भी काम नहीं करता - सी #, पृष्ठभूमि कर्मचारी

मेरे पास एक कक्षा है जो मेरे जीयूआई पर प्रगति पट्टी अपडेट करती है। मैंने "DoWork" और "RunWorkerCompleted" दोनों के साथ पृष्ठभूमि वर्कर का उपयोग किया, लेकिन दोनों ने मुझे एक ही त्रुटि दी:

"धागे के अलावा किसी धागे से पहुंचा जो इसे बनाया गया था"

मैंने सोचा कि "RunWorkerAsync ()" विधि का उपयोग करके यह GUI थ्रेड पर आदेश चलाता है, इसलिए मुझे लगता है कि मैं गलत था।

यहां प्रासंगिक कोड है (DoWork और RunWorker दोनों को आजमाया गया):

this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted);




private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
this.progressBar1.PerformStep();
}
catch (Exception Ex)
{
Program.handleException(Ex, MethodBase.GetCurrentMethod().Name);
}
}




//public access from another class, that"s my main problem
//I don"t activate the performStep() by pressing a button but its called by progress...
//BTW, the while loop isn"t efficient it is temporary..
public void performStep()
{
try
{
this.backgroundWorker2.RunWorkerAsync();
while (this.backgroundWorker2.IsBusy)
{
Console.WriteLine("worker2 is busy");
}
}
catch (Exception Ex)
{
Program.handleException(Ex, MethodBase.GetCurrentMethod().Name);
}
}

क्या किसी को पता है कि यह अभी भी उस त्रुटि क्यों देता है? (बीटीडब्ल्यू मैंने प्रतिनिधियों का उपयोग करने की कोशिश की लेकिन एमएसडीएन द्वारा इस तरह से अधिक सुविधाजनक और अनुशंसित पाया गया, इसलिए मैं इस विधि से चिपकना चाहता हूं ..)

बहुत बहुत धन्यवाद!!

उत्तर:

उत्तर № 1 के लिए 1

Backgroundworker GUI थ्रेड पर आदेश नहीं चलाता है। यह उन्हें एक अलग, समर्पित धागे पर चलाता है।

यूआई थ्रेड पर चीजों को चलाने के लिए, आप अपने नियंत्रण पर Invoke विधि का उपयोग करते हैं:

private void PerformStep()
{
if (progressBar1.InvokeRequired)
{
progressBar1.Invoke(
new MethodInvoker(() => progressBar1.PerformStep()));
}
else
{
progressBar1.PerformStep();
}

}


संबंधित सवाल
सबसे लोकप्रिय