2012-04-10 8 views
3

Ich habe eine WPF-Anwendung, und ich bin etwas Animation in einem anderen Thread ausgeführt, so dass mein Haupt-UI-Thread reagieren wird. Ich verwende den Code here posted:Ausnahme beim Erstellen WPF-Fenster in einem anderen Thread

Thread thread = new Thread(() => 
{ 
    Window1 w = new Window1(); 
    w.Show(); 

    w.Closed += (sender2, e2) => w.Dispatcher.InvokeShutdown(); 

    System.Windows.Threading.Dispatcher.Run(); 
}); 

thread.IsBackground = true; 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

Es funktioniert in der Regel gut, aber nachdem das System eingesetzt wurde bekam ich Beschwerde über den Absturz der Anwendung mit dem folgenden Stack-Trace:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at System.Collections.Generic.List`1.RemoveAt(Int32 index) 
    at System.IO.Packaging.PackagePart.CleanUpRequestedStreamsList() 
    at System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess access) 
    at System.IO.Packaging.PackagePart.GetStream() 
    at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
    at Window1.xaml:line 1 
    at Window1..ctor() 

jemand gesehen dieses Ausnahme vor und kann erklären, was dort vor sich geht? Was könnte der Grund für diese spezielle Ausnahme sein?
Ich verwende .NET 3.5 SP1

Antwort

1

Es sieht aus wie System.Windows.Application.LoadComponent ist nicht Thread-sicher so Ihren Anruf Konstruktor Fensterfehler verursachen kann.

Sie können versuchen, Fensterinstanzen im Hauptthread zu erstellen und sie nur im neuen Thread anzuzeigen, aber ich bin mir nicht sicher, ob dies zu Ihren Anwendungsanforderungen passt.

+0

Klingt wie eine Lösung :-) Haben Sie zusätzliche Hinweise, um diese Annahme zu bestätigen? Ich habe keine Möglichkeit es zu testen, da es nur einmal im Feld passiert ist ... –

+0

Nein, das ist nur eine Idee. Sie können sich den Code von System.Windows.Application.LoadComponent ansehen, um dort Thread-Sicherheitsprobleme zu finden. Oder Sie können versuchen, Test LoadComponent mit Test zu testen, der viele Fenster gleichzeitig auf verschiedenen Threads erstellt, um diesen Fehler zu reproduzieren – Nikolay

+0

Ok, danke. Ich sehe es mir an - ich habe Sie aufgestuft und werde diese Antwort akzeptieren, wenn ich sicher bin, dass es die eigentliche Ursache für die Ausnahme ist, die ich hatte. –

Verwandte Themen