I eine Art von Plug-in-Modell haben, in dem verschiedene komplexe Benutzersteuerungen in DLLs und geladen und instanziiert zur Laufzeit gespeichert werdenErstellen von Steuerelementen in einem nicht-UI-Thread
Activator.CreateInstanceFrom(dllpath, classname).
Verwendung Da ich bin Lade einige davon wollte ich im Hintergrund tun, indem ich meine Benutzeroberfläche ansprechbar halte, indem ich einen neuen Thread für das Laden erstelle. Die Kontrollen werden dann zum Hauptformular weitergeleitet und bei Bedarf angezeigt.
Dies scheint gut zu funktionieren - bis ich versuche, eine Eigenschaft auf einem verschachtelten Steuerelement auf einem dieser Benutzersteuerelemente, z. im Ereignishandler einer Schaltfläche, die eine Cross Threading-Ausnahme auslöst. Mir ist klar, dass ich dies vermeiden kann, indem ich InvokeRequired jedes Mal überprüfe, wenn ich auf eine Eigenschaft zugreife, aber ich muss mir darüber keine Gedanken machen, wenn ich den Code für die Benutzersteuerelemente schreibe (besonders da es andere gibt, die diese Codes schreiben) nicht immer erinnern).
Also meine Frage ist, gibt es eine sichere Möglichkeit zu tun, was ich versuche, oder wie sollte ich am besten über das Laden dieser Steuerelemente im Hintergrund gehen? Oder ist es im Grunde unmöglich und muss ich mich an den Hauptthread zum Erstellen von Steuerelementen halten?
Ich hoffe, dass die Informationen, die ich zur Verfügung gestellt habe, genug sind, um meine Situation klar zu machen; Wenn nicht, würde ich gerne Code-Beispiele ausarbeiten und zur Verfügung stellen.
"bis ich versuche, eine Eigenschaft zu setzen" - ist das im Thread oder später? –
Das ist später, nachdem die Benutzersteuerung zum Hauptformular (wie in form.controls.add (mycontrol) –