[Gelöst]Form aus einem Thread aufrufen



  • Hi Community,

    beim Versuch ein Form aus einem zweiten Thread zu erstellen, scheitert mein Code beim Invoke und wirft eine Exception.

    Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

    vom Typ InvalidOperationException.

    Die Situation sieht wie folgt aus:

    Ich lasse meine Anwendung auf Nachrichten einer weiteren Instanz meiner Anwendung warten. Die Nachrichten treffen über Pipes ein. Ist eine neue Nachricht eingetroffen, wird diese durch einen Parser gejagt. Dieser soll feststellen ob die Nachricht für meine Anwendung relevante Befehle enthält. Ist dies der Fall, so wird meine Anwendung angewiesen bestimmte von mir definierte Aktionen auszulösen. In meinem aktuellem Fall, soll ein neues WindowsForm erstellt werden um diverse Informationen anzuzeigen.

    Um das Szenario ein wenig zu verdeutlichen, poste ich mal die relevanten Ausschnitte aus meiner Anwendung.

    Mein delegate für die Funktion:

    private delegate void InvokeFormPersonDetail(Stelle stelle, Person person);
    

    Mein abonniertes Event:

    void commanderEvents_OpenBewerber(Stelle stelle, Person person)
            {
                object[] parameters = { stelle, person };
    
                Control ctrl = new Control();
                ctrl.Invoke(new InvokeFormPersonDetail(CreateFormPersonDetail), parameters);
            }
    

    Die Exception tritt beim Invoke auf. Der Versuch im Konstruktor des aufzurufenden Forms ein CreateControl() zu platzieren um ein Win32 Handle zu erzwingen half leider nicht weiter.

    Evtl. hat einer von euch eine Idee oder Lösung, die mich hier weiter bringen könnte.

    Gruß!

    Edit: Ich habe den Fehler gefunden. Mein Event muss natürlich so aussehen:

    void commanderEvents_OpenBewerber(Stelle stelle, Person person)
            {
                object[] parameters = { stelle, person };
                this.Invoke(new InvokeFormPersonDetail(CreateFormPersonDetail), parameters);
            }
    

    Der Invoke Aufruf muss natürlich auf meine Form (this) gelegt werden und nicht auf ein neues Control.
    Jetzt funktioniert es wie es soll.

    /Wenn der Admin möchte, kann er meinen Beitrag wieder entfernen./


Log in to reply