Erstellen eines Formulars und Verwenden von Form.ShowDialog in einem Hintergrundthread

8

Winforms verwenden Wenn ich auf einem Thread bin, der nicht der "Haupt" -Ui-Thread ist, kann ich sicher

  1. Erstellen Sie ein Formular,
  2. Rufen Sie ShowDialog auf diesem Formular auf

Es scheint so, als würde ich der Regel folgen: Winforms-Steuerelemente müssen für den Thread geändert werden, in dem sie erstellt wurden.

Aus einigen der Lektüre, die ich gemacht habe, scheint ShowDialog seine eigene Nachrichtenpumpe zu erstellen, so dass ich mir keine Sorgen machen muss, dass das Formular auf einem Thread erstellt wird, der bereits eine Nachrichtenpumpe hat.

Der Hintergrund der Frage ist, dass ich einen Rückruf erhalte, bei dem ich eine Winforms-Benutzeroberfläche anzeigen möchte, aber ich habe keinen Zugriff auf eine andere Benutzeroberfläche, die ich zum Aufrufen des Hauptthreads verwenden könnte.

>     
Matt Smith 05.06.2012, 22:23
quelle

2 Antworten

7

Das ist ungefähr richtig, obwohl es ziemlich wichtig ist, dass Sie die SetApartmentState () - Methode des Threads aufrufen, um den Thread auf STA umzuschalten. Wichtig für viele UI-Operationen, einschließlich der Zwischenablage, Drag & Drop und den Shell-Dialogen. Und dass Sie normalerweise ein problematisches Z-Ordnungs-Problem haben, wenn das Formular, das Sie in dem Thread erstellen, nicht in dem Vordergrund ist und sich hinter einem anderen Fenster verbirgt. Oder hat die unangenehme Angewohnheit, sich tatsächlich im Vordergrund zu bewegen, wenn der Benutzer es nicht erwartet und einen Mausklick oder eine Tasteneingabe unerwartet ergreift.

Das sind harte Probleme zu beheben, sie machen Ihre App flockig. Es gibt keinen guten Grund, nicht auf einen Verweis zu verweisen, Sie können ihn auch an die Klasse weitergeben. Sie haben immer auf Application.OpenForms [0] zurückgreifen können, wenn es wirklich notwendig ist.

    
Hans Passant 06.06.2012, 00:03
quelle
2

Ja, Sie können das tun, aber wenn Sie möchten, dass der Dialog sich tatsächlich wie ein modaler Dialog verhält (dh das übergeordnete Fenster blockieren, was ich annehmen möchte, da Sie ShowDialog aufrufen), dann seien Sie darauf vorbereitet, enttäuscht zu sein .

Welches Problem versuchen Sie hier eigentlich zu lösen? Es klingt wie ein modaler Dialog, der nicht blockiert, was ein bisschen seltsam ist. Wenn Sie das vorliegende Problem erklären, gibt es möglicherweise eine Lösung, die Sie noch nicht berücksichtigt haben.

    
Ed S. 05.06.2012 22:51
quelle

Tags und Links