2012-04-10 3 views
3

У меня есть приложение WPF, и я запускаю анимацию в другом потоке, поэтому мой основной поток пользовательского интерфейса будет реагировать. Я использую код отправил 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

Хорошо, спасибо. Я посмотрю на это - я поддержал вас и приму этот ответ, когда я буду уверен, что это настоящая первопричина исключения, которое у меня было. –

Смежные вопросы