2017-01-25 15 views
0

기본 창을 렌더링 할 때 gif를로드하는 창을 만들어야합니다. 몇 가지 기사를 읽고이 목적을 위해 새로운 스레드를 만들어야한다는 결정을 내립니다. 내가 ShowLoading()를 호출하고 내가 원하는처럼 다음 HideLoading() 모든 작품 때WPF 다른 STA 스레드의 레크리에이션 창

LoadingDialog _loadingDlg; 
Thread loadingThread; 

public void ShowLoading() 
{ 
    loadingThread = new Thread(new ThreadStart(loadingThreadWork)); 
    loadingThread.SetApartmentState(ApartmentState.STA); 
    loadingThread.Start(); 
} 

private void loadingThreadWork() 
{ 
    _loadingDlg = new LoadingDialog(); 
    _loadingDlg.Show(); 
    System.Windows.Threading.Dispatcher.Run(); 
} 

public void HideLoading() 
{ 
    _loadingDlg.Dispatcher.InvokeShutdown(); 
} 

처음 : 나는 그런 일을 한 결과 this article

에서처럼했다. 내가 두 번째 시간에 ShowLoading()를 호출 할 때하지만 메시지 The calling thread cannot access this object because a different thread owns it

_loadingDlg.Show(); 

에서 예외가.

어떻게 될 수 있습니까? _loadingDlg은 이전 행과 동일한 스레드에서 작성됩니다.

+0

왜 새 창을 만드나요? 중앙 집중식 그리드를 만들고 가시성을 전환하는 것이 왜 좋은가요? –

답변

0

loadingThreadWork에서 컨트롤을 만들면 처음 실행하기 전에 null이므로 처음 성공할 때입니다. 그러나 컨트롤의 소유자로 표시된 다른 스레드에서 대화 상자를 만들고 있습니다.

다음 번에 loadingThreadWork을 호출 할 때 컨트롤이 null이 아니며 다른 스레드에서 앤트로 변경됩니다 (다시 작성하기 때문에 다른 스레드). 예외가 발생합니다 당신이있어.

WPF을 사용하고 있으므로 스레드에서 async 작업으로 전환해야합니다.이 작업은 현재 솔루션보다 훨씬 읽기 쉽고, 예측 가능하며 예측 가능합니다.

+0

감사. 당신 말씀으로 나는 내 문제를 해결할 길을 찾았습니다. 소유자가 클래스에 대해 결정되는 것이 옳은 것입니까? 예를 들어 아닙니다. 좀 더 자세한 내용을 읽을 수있을 때 몇 가지 기사를 줄 수 있습니까? –

+0

아니요, 소유자는 인스턴스별로 결정됩니다. 메시지 오류로 검색 할 수 있습니다. 이는 일반적인 오류입니다. – VMAtm

+0

하지만 새 스레드로 인스턴스를 다시 만들었습니다. 그리고이 후에 나는 예외를 얻는다. –