2012-04-10 1 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

解決策のようなサウンド:-)この前提をバックアップするための追加の参考資料がありますか?私は一度だけ現場で起こったので、私はそれをテストする方法がありません... –

+0

いいえ、これは単なるアイデアです。 System.Windows.Application.LoadComponentのコードを見て、そこにスレッドセーフの問題を見つけることができます。または、このバグを再現するために、異なるスレッドに同時に多数のウィンドウを作成するテストでLoadComponentをテストすることができます。 – Nikolay

+0

ありがとう、ありがとう。私はそれを見てみましょう - 私はあなたをupvotedし、私が持っていた例外の本当の根本原因であることを確認するときにこの答えを受け入れます。 –

関連する問題