2012-04-10 63 views
3

我有一個WPF應用程序,並且在不同的線程中運行一些動畫,所以我的主UI線程將會響應。我正在使用的代碼發佈here在另一個線程中創建WPF窗口時出現異常

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(); 

它通常工作正常,但系統部署後,我提出投訴應用程序崩潰與下面的堆棧跟蹤:

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() 

有沒有人見過這個例外之前,可以解釋那裏發生了什麼?什麼可能是這個具體例外的原因?
我正在使用.Net 3.5 SP1

回答

1

它看起來像System.Windows.Application.LoadComponent不是線程安全的,因此您對Window構造函數的調用可能會導致錯誤。

您可以嘗試在主線程中創建窗口實例並將其顯示在新線程中,但我不確定它是否適合您的應用程序需要。

+0

聽起來像一個解決方案:-)你有任何額外的參考備份這個假設?我無法測試它,因爲它只發生過一次... – 2012-04-10 13:33:13

+0

不,這只是一個想法。你可以看看System.Windows.Application.LoadComponent的代碼來找到那裏的線程安全問題。或者你可以嘗試用測試來強調測試LoadComponent,在不同的線程上同時創建多個窗口來重現此bug – Nikolay 2012-04-10 14:57:39

+0

好的,謝謝。我會看看它 - 我鼓勵你,並且會接受這個答案,當我確定它是我所遇到的異常的真正根源。 – 2012-04-12 12:16:40

相關問題