2012-06-05 10 views
8

Mit WinForms verwenden, Wenn ich an einem Faden bin, der nicht der „main“ ui Thread kann ichein Formular erstellen und Form.ShowDialog auf einem Hintergrund-Thread

safetly
  1. ein Formular erstellen,
  2. Anruf Showdialog auf dem Formular

Es scheint, als würde ich die Regel werden gehorchen. WinForms Kontrollen müssen auf dem Thread modifiziert werden sie erstellt wurden

Aus einigen der Lektüre, die ich gemacht habe, scheint ShowDialog eine 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 bekomme, wo ich einige Winforms UI anzeigen möchte, aber ich habe keinen Zugriff auf andere Benutzeroberfläche, die ich verwenden könnte, um den Haupt-Thread aufzurufen.

+0

+1 das war eine gute Frage. –

Antwort

7

Das ist in etwa richtig, obwohl es ziemlich wichtig ist, dass Sie die SetApartmentState() - Methode des Threads aufrufen, um den Thread in STA zu wechseln. 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 eklige Angewohnheit von 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.

+0

Danke Hans. Irgendwelche Nachteile gegenüber der Verwendung von Application.OpenForms [0]? Ist es immer garantiert zu existieren? –

+1

@MattSmith: Es sollte, ja, aber ich fand [diese SO-Post] (http://stackoverflow.com/questions/3751554/application-openforms-count-0-allways) Detaillierung eines Fehlers, nicht sicher, ob das existiert immernoch. –

+1

Es existiert immer noch, ist aber leicht zu vermeiden. –

2

Ja, Sie können das tun, aber wenn Sie möchten, dass der Dialog tatsächlich wie ein modaler Dialog funktioniert (d. H. Das übergeordnete Fenster blockieren, was ich annehmen möchte, da Sie ShowDialog anrufen), seien Sie darauf vorbereitet, enttäuscht zu werden.

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 Problem erklären, gibt es möglicherweise eine Lösung, die Sie noch nicht berücksichtigt haben.

+0

Guter Punkt. In meinem Fall bekomme ich einen Rückruf und es kann sein, dass andere ui zu der Zeit angezeigt werden. Ich habe keinen Grund, nicht auf dem Haupt-ui-Thread zu sein, ich hatte einfach keine Kontrolle, mit der ich aufrufen könnte. –

Verwandte Themen