Ich erstellte eine einfache Testmethode in einer neuen Anwendung, die aufgerufen wird, wenn ich auf die Schaltfläche (nur) auf meinem Hauptformular klicke. Das Verfahren sieht wie folgt aus:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(() =>
{
Window1 window = new Window1();
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Window1
ist ein Fenster der Klasse I gemacht, dass nichts anderes als eine einzige TextBlock
drauf hat. Ich kann so oft auf diese Schaltfläche klicken, und es öffnet weiterhin neue Fenster ohne Probleme (unabhängig davon, ob ich die vorherige zuerst schließe).
Ich vermute, dass das Problem im Code auftritt, dass Sie uns nicht irgendwo zeigen. Sie müssen sehr vorsichtig sein, dass nichts in Ihrem neuen Thread versucht, auf irgendeine Benutzeroberfläche zuzugreifen, die sich auf Ihren Hauptthread bezieht. Windows, die auf separaten Threads ausgeführt werden, können nicht miteinander kommunizieren, es sei denn, sie durchlaufen den Dispatcher des anderen Threads. Die Ausnahme, die Sie sehen, wird ausgelöst, wenn auf eine Methode oder Eigenschaft eines DispatcherObject von einem anderen Thread als dem, der das Objekt erstellt hat, zugegriffen wird.
Einen Schritt zurück, warum ist es wichtig, dass das neue Fenster auf einem eigenen Thread ist? Wenn das neue Fenster den Thread nicht monopolisiert, wird es wahrscheinlich auf dem Hauptthread gut laufen. Wenn Sie eine lange blockierende Operation ausführen, sollte diese Operation möglicherweise nur in einen Thread und nicht in das gesamte Fenster verschoben werden. Ich weiß nicht, was du genau machst, aber es ist etwas, über das du nachdenken solltest.
EDIT: Die Erkenntnis, dass Sie nicht in einer typischen WPF-Anwendung ausgeführt werden können (sieht aus wie Sie in einer Office-Plugin sein könnten), ich meine Prüfung aktualisierte die Fenster vollständig auf ihre eigenen Threads Standalone zu starten. Ich bin jedoch immer noch in der Lage, zwei Fenster hintereinander ohne Probleme zu starten.
Hier ist mein neuer Test. Diese Methode und die Testklasse Window1
sind die Gesamtheit meiner Anwendung.
[STAThread]
public static int Main(string[] args)
{
ThreadStart threadFunc =() =>
{
Window1 window = new Window1();
window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
window.Show();
System.Windows.Threading.Dispatcher.Run();
};
Thread thread = new Thread(threadFunc);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
thread = new Thread(threadFunc);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
return 0;
}
So scheint es nichts falsch mit dem, was Sie zu tun versuchen, noch sehe ich offensichtliches Problem in Ihrem Code. Ich vermute, dass irgendwo in Ihrem benutzerdefinierten Fenster eine ungültige Cross-Thread-Kommunikation stattfindet, während sie angezeigt wird. (Entweder das oder ein Problem mit Office-Plugins.)
Warum möchten Sie einen neuen Thread erstellen, um dieses Fenster anzuzeigen? Dies ist im Allgemeinen keine gute Idee. Und zweitens habe ich das versucht und es funktioniert gut (außer ich habe keine Ahnung was "LoginCheck" tut). Wo tritt die Ausnahme auf? –
Der gesamte Code für die Benutzeroberfläche muss im Hauptthread ausgeführt werden. Was versuchst du hier zu erreichen? – almulo
Normalerweise bezieht sich dieser Fehler darauf, dass Sie versuchen, auf eine Eigenschaft in Ihrem ersten Formular zuzugreifen, von der, die Sie abgeschnürt haben. Wir müssten tatsächlich sehen, was auf dem zweiten Formular passiert, das das Problem verursacht. – DoomVroom