4

私は WPF アプリケーションを持っていて、いくつかのアニメーションを別のスレッドで実行しているので、メインの UI スレッドは応答します。ここに投稿されたコードを使用しています:

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を使用しています

4

1 に答える 1

2

System.Windows.Application.LoadComponentスレッドセーフではないようですので、Windowコンストラクターを呼び出すとエラーが発生する可能性があります。

メインスレッドでウィンドウインスタンスを作成し、それを新しいスレッドで表示することもできますが、それがアプリケーションのニーズに合っているかどうかはわかりません。

于 2012-04-10T13:27:06.110 に答える