2011-09-23 2 views
1

응용 프로그램이 초기 데이터를로드하는 동안 내 응용 프로그램의 스플래시 화면을 유지하려고 시도했지만 아직 수행 방법을 찾지 못했습니다.다른 작업이 수행되는 동안 다른 스레드에서 창 새로 고침?

SplashView splashScreen = new SplashView(); 
      new Thread((ThreadStart)delegate 
      { 
       splashScreen.Dispatcher.Invoke((Action)delegate 
       { 
        while ((bool)splashScreen.Dispatcher.Invoke((Func<SplashView, bool>)delegate(SplashView sView) { return sView.IsEnabled; }, DispatcherPriority.Render, new object[] { splashScreen })) 
        { 
         splashScreen.Dispatcher.Invoke((Action<SplashView>)delegate(SplashView sView) { sView.UpdateLayout(); }, DispatcherPriority.Render, new object[] { splashScreen }); 
         Thread.Sleep(10); 
        } 
       }, DispatcherPriority.Render, new object[] { }); 
      }).Start(); 

사람이 어떻게이를 말해 주시겠습니까 : 여기

은 내가 시도 코드?

감사합니다. 알렉스.

답변

2
  1. 모든 데이터 (모델/뷰 모델)를 백그라운드 스레드 (예 : BackgroundWorker)로로드하십시오.
  2. Dispatcher.Invoke() 코드의 동기 실행으로 인해 여러 호출이 차단되므로 UI ​​스레드가 중단됩니다. 대신 Dispatcher.BeginInvoke()을 사용하십시오. 디스패처 큐를보다 효과적으로 사용합니다.
  3. DispatcherPriority을 사용하십시오. 중요도가 낮은 모든 스플래시 UI 알림은 우선 순위가 높은 스플래시 UI 알림 뒤에 표시 될 수 있습니다.
  4. 우선 순위에 대해 Splash에 알리려면 Dispatcher.PushFrames()을 사용하십시오.
  5. 다중 배경 스레드에서 데이터로드를 분할하고 느린 데이터 스레드가 완료 될 때 Wait/Pulse을 사용하여 다른 사람들에게 알립니다. 관련없는 데이터는 다른 스레드에로드 될 수 있습니다. 재무 관련 데이터와 직원 관련 데이터는 서로 다른 스레드를 사용하여로드 할 수 있습니다.
+0

관측 가능한 콜렉션에 멀티 스레드가 아닌 데이터가 채워지므로 별도의 스레드에서로드를 수행 할 수 없으며 일부 예제를 제공 할 수 있습니까? –

+0

Observable Collections는 items 컨트롤에 이미 바인딩되어 있고 실제로는 다중 스레드는 아니지만 thrad safe observable 컬렉션이 이미 존재하는 경우에만 스레드 액세스 문제를 발생시킵니다. http://blogs.microsoft.co.il/blogs/tamir/archive /2007/04/22/Thread-safe-observable-collection.aspx .... 또한 WPF 스플래쉬 스크린 로딩에 대한 웹 예제가 많이 있습니다. 이 예제는'PushFrames()'를 사용합니다. http://www.codeproject.com/KB/WPF/WPFsplashscreen.aspx ....이 예제는'AutoResetEvent'를 사용하여 Pulse/Wait와 함께 멀티 스레딩을 사용합니다 ... http : // szymonrozga .net/blog /? p = 136. –

+0

ObservableCollection 스레드를 안전하게 만드는 데 대한 게시물이 도움이되었습니다. 감사합니다. –

관련 문제