Fehler: "Zugriff von einem anderen Thread als dem Thread, auf dem es erstellt wurde" Ich habe Hintergrundarbeiter verwendet und funktioniert immer noch nicht - c #, backgroundworker

Ich habe eine Klasse, die eine Fortschrittsanzeige auf meiner GUI aktualisiert. Ich habe den backgroundWorker benutzt, sowohl mit "DoWork" als auch mit "RunWorkerCompleted", aber beide gaben mir den gleichen Fehler:

"Zugriff von einem anderen Thread als dem Thread, auf dem es erstellt wurde"

Ich dachte, dass mit der Methode "RunWorkerAsync ()" die Befehle auf dem GUI-Thread ausgeführt werden, also lag ich falsch.

Hier ist der relevante Code (versucht sowohl DoWork als auch RunWorkerCompleted):

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);
}
}

Weiß jemand, warum es immer noch diesen Fehler gibt? (Ich habe versucht, Delegierte zu verwenden, aber auf diese Weise bequemer und von MSDN empfohlen, also möchte ich bei dieser Methode bleiben ..)

Danke vielmals!!

Antworten:

1 für die Antwort № 1

Backgroundworker führt die Befehle im GUI-Thread nicht aus. Es führt sie auf einem separaten, dedizierten Thread aus.

Um Dinge im UI-Thread auszuführen, verwenden Sie die Invoke-Methode für Ihr Steuerelement:

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

}


Verwandte Fragen