Pass in der übergeordneten form von ShowDialog, die aufgerufen wird, eine Instanz der Klasse

Ich habe ein Formular.

In dieser form erstelle ich eine Instanz einer Klasse in einem neuen thread, weil es läuft einige lang laufende Logik. Die form gibt dem Benutzer die Möglichkeit zum Abbrechen dieser Logik/thread.

Diese Klasse öffnet ein neues Formular aus, wenn eine Eingabe erforderlich.

Die neue form manchmal erscheint hinter der anderen form.

Ich eine Eigenschaft der Klasse:

public Form ParentForm{get;set;}

Kann ich jetzt tun:

MyForm form = new MyForm();
form.ShowDialog(ParentForm);

Jedoch bekomme ich eine cross-thread-exception beim Aufruf ShowDialog(ParentForm).

Ich weiß, dass ich verwenden können InvokeRequired irgendwie aber nicht sicher, wie Sie Sie auf eine Eigenschaft.

Dank

UPDATE: Habe versucht dies zu tun aber bekomme immer noch die Ausnahme:

MyForm form = new MyForm();
form.ShowDialog(GetParentForm()); 



private Form GetParentForm()
{
    //You have to Invoke() so you can wait for the function to return and obtain its return value.
    if (ParentForm.InvokeRequired)
    {
        return (Form)ParentForm.Invoke(new Func<Form>(() => GetParentForm()));
    }
    else
    {
        return ParentForm;
    } 
}
  • Winforms flubs diese Prüfung und umgangen werden kann, aber das problem ist bezeichnend für ein größeres Problem. Sie schob sich ein dialog, wenn der Benutzer arbeitet mit einem Fenster auf Ihrem Haupt-thread. Wenn Sie nicht erwarten, dass es. Chancen sind hoch, dass Sie versehentlich schließen Sie das Dialogfenster mit einem Mausklick oder Tastendruck, die bestimmt war für das Hauptfenster. Sie werden noch nicht einmal sehen, den dialog. Das problem beheben Sie zuerst, und Sie werden nicht über dieses problem.
  • Ist der Nutzer es erwartet. Sie auf eine Schaltfläche klicken, beginnt der Faden, und Sie haben einen laden von gif zu zeigen, die Aufgabe ist ausgeführt und wissen, zu warten, bis Sie zurückkehren oder die Interaktion mit popup, die angezeigt werden können
  • Gut, dann eben auf dem UI-thread. Verwenden Sie Die Kontrolle.BeginInvoke()
  • Wie rufe ich die showMyNewForm aus meiner eigenen Klasse in einem anderen thread und testen Sie seine ModalResult?
InformationsquelleAutor Jon | 2012-06-19
Schreibe einen Kommentar