2011-08-29 6 views
1

잘 디자인되지 않은 대형 응용 프로그램이 있습니다. 특히 시작시 UI 스레드에서 많은 서비스를 초기화합니다. 문제는 초기화가 시간 소모적 일 수 있으므로 UI ​​스레드가 멈추는 것입니다. 일부 서비스는 시작한 스레드에 의존하기 때문에 백그라운드 스레드로 이동할 수 없으며 단순히 너무 많은 코드로 인해 줄별로 위치를 확인할 수 없습니다.WPF에서 사용되는 리소스를 분리 할 수있는 방법이 있습니까?

ThreadStart initLoadingDialog =() => 
            { 
             _currentDispatcher = Dispatcher.CurrentDispatcher; 
             _dialogWindow = new MyDialogWindow(); 
             _dialogWindow.Show(); 
             Dispatcher.Run(); 
            }; 
var thread = new Thread(initLoadingDialog); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

내가 MVVM을 사용하여 설정 내용과 거기에 더 MyDialogWindowClass가 없습니다 아니라 단지 창 때문에 (음, 코드가 정확히 정확하지 :

아이디어는 별도의 발송자와 별도의 스레드에서의 ProgressBar과 로딩 화면을 보여주는 것입니다 ViewModel과 DataTemplate 리소스에 있습니다.하지만 ASAIK는 중요하지 않습니다.)

작동하지만 일부 리소스를 사용하는 것으로 보이므로 비 기본 UI 스레드에 효과적으로 바인딩됩니다. "System.Windows.Media.Brush"유형의 객체로 'Background'속성의 값을 변환 할 수 없습니다. 다른 스레드가 소유하고 있기 때문에 호출하는 스레드가이 객체에 액세스 할 수 없습니다. 'System.Windows 객체에서 오류가 발생했습니다. .Controls.Border 'in 마크 업 파일'PresentationFramework.Aero, 버전 = 3.0.0.0, 문화 = 중립, PublicKeyToken = 31bf3856ad364e35, ProcessorArchitecture = MSIL, 구성 요소/테마/aero.normalcolor.xaml '. "

음, 내가 원하는 것은이 단일 대화 상자를 완전히 분리하여 자체 리소스 (사실상 ProgressBar가있는 Grid 및 두 개의 TextBlocks가 있음)를 가지며 다른 용도는 사용하지 않기를 원합니다. 이것을 할 수있는 방법이 있습니까?

P. 아니면 누군가 어떤 Brush 리소스가 문제인지 정확하게 판단하는 방법을 알고 있습니까? 나는이 예외만을 가지고 있기 때문에 ... 문제의 근원은 무엇입니까?

UPD : 이것은 ProgressBar입니다. 그 스타일은 고정되지 않은 브러시를 사용하며 스레드에 바인딩됩니다.

답변

1

문제의 원인이되는 브러시가 이전 UI UI 스레드에서 인스턴스화되었으므로 오류가 표시되는 것 같습니다. 대화 상자의 모든 컨트롤의 컨트롤 템플릿을 재정의하고 모든 브러시를 고정해야 할 수도 있습니다. 이 같은

뭔가 :

<LinearGradientBrush freezable:Freeze="True" 
xmlns:freezable="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
/> 

또한, 나는 운영자가 사용자의 윈도우가 닫힌 후 계속 실행됩니다 믿습니다. 수동으로 종료해야합니다.

_dialogWindow.Closed += (sender, e) => _dialogWindow.Dispatcher.InvokeShutdown(); 
+0

아니요, 대화 상자가 정상적으로 표시되고 닫힙니다. 그러나 몇 가지 대화 상자를 표시하면 실패합니다. 하나의 대화 상자. 이 구체적인 대화가 다른 사람들과 어떻게 다른지 이유를 모릅니다. 추신 예, 실제로 InvokeShutdown()을 호출합니다. 질문에 노출되지 않았습니다. 감사. –

+0

어쨌든 모든 컨트롤 템플릿을 재정의하는 것은 약간의 작업처럼 보입니다. ProgressBar에 대해서도. 나는 freezables에 대해 알고 있었지만 문제는 리소스의 일부를 안전하게 공유하는 대신 앱의 나머지 부분에서이 특정 대화 상자를 분리하는 방법 (필요한 경우 새로운 것을 만들도록 강제)에 관한 것이 었습니다. –

+0

에어로 브러시는 많은 컨트롤에서 사용되며 일단 인스턴스화되면 사전에 저장됩니다. 대화 상자에 사전에 이미있는 브러시 (기본 UI 스레드에서 생성 된 브러시)를 사용하거나 그 반대의 경우에는 문제가 발생합니다. – mdm20

관련 문제