Autor Beitrag
MrDude
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 22

Win 2000, Win XP Pro., Kubuntu, Debian
C# (VS 2008)
BeitragVerfasst: Mi 08.11.06 10:36 
Hallö!

Ich hätt da wiedermal ein Problem das mich nicht in Ruhe lässt:
Ich versuche aus einem BackgroundWorker heraus auf eine ListBox zuzugreifen und Einträge hinzuzufügen. Das ganze sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private void Work_DoWork(object sender, DoWorkEventArgs e)
        {
            WriteReport("Test!");
        }
private void WriteReport(String Text)
        {
            ReportBox_small.Items.Add(Text);
        }

Landet er aber bei der Stelle ReportBox_small.Items.Add(Text); gibt es eine Exception oder sowas ähnliches (sieht nich gleich aus wie eine...) in der es heisst:
Böse Exception hat folgendes geschrieben:
InvalidOperationException was unhandled by user code
Cross-thread operation not valid: Control 'ReportBox_small' accessed from a thread other than the thread it was created on.

Ich interpretiere das als "Tschuldigung, ich bin ein anderer Thread und hab keine Permissions für die Form."

Ein Bekannter hat mir gesagt, es gäbe eine Lösung dafür, hat mir ein Buch in die Hand gedrückt und gemeint, hier KÖNNTE es evt. drinstehen. Tat es leider nicht. Google erbringt auch nichts schlaues, die MicrosoftSchrottHilfe versteh ich nicht wirklich und hier haben anscheinend zu wenig Leute Probleme damit...

Weiss Jemand wie ich den BackgroundWorker auf die Form zugreifen lassen kann?

Danke!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 08.11.06 16:18 
Egal für wie schlecht du das SDK hältst, diesen Hinweis hättest du eigentlich nicht übersehen können:
Zitat:
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events.

Wahrscheinlich benötigst du aber gar keinen Worker. Wenn es nur darum geht, eine einzige Methode asynchron aufzurufen, solltest du im SDK-Index nach Asynchronous Delegates suchen. Und zum Synchronisieren von Threads findest du Stoff unter Control.Invoke.
Ein exzellentes Buch, in dem beides behandelt wird, wäre übrigens "CLR via C#" von Jeffrey Richter.