2012-04-10 7 views
3

WPF 응용 프로그램이 있고 다른 스레드에서 일부 애니메이션이 실행 중이므로 내 주 UI 스레드가 반응합니다.다른 스레드에서 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() 

사람은 본 적이이 나는 코드가 here 게시 사용하고 있습니다 전에 예외가 있었고 거기에 무슨 일이 일어나는지 설명 할 수 있습니까? 이 특별한 예외의 이유는 무엇일까요?
사용하고 있습니다. 닷넷 3.5 SP1

답변

1

System.Windows.Application.LoadComponent은 스레드 안전하지 않으므로 Window 생성자를 호출하면 오류가 발생할 수 있습니다.

주 스레드에서 창 인스턴스를 만들고 새 스레드에 표시하려고 할 수 있지만 응용 프로그램 요구 사항에 맞는지 확실하지 않습니다.

+0

소리가 좋은 해결책 :-)이 가정을 뒷받침하는 추가 참조가 있습니까? 난 단지 그것을 한 번 현장에서 일어난 이후로 그것을 테스트 할 수있는 방법이 없습니다 ... –

+0

아니, 이것은 생각이다. 거기에서 스레드 안전 문제를 찾으려면 System.Windows.Application.LoadComponent의 코드를 살펴보십시오. 또는이 버그를 재현하기 위해 여러 스레드에서 동시에 여러 창을 생성하는 테스트로 LoadComponent 테스트를 스트레스 할 수 있습니다. – Nikolay

+0

감사합니다. 나는 그것을 살펴볼 것입니다 - 나는 당신을 upvoted했고, 내가 가지고있는 예외의 진정한 근본 원인이라고 확신 할 때이 대답을 받아 들일 것입니다. –

관련 문제