2012-08-16 2 views

답변

14

글쎄, 당신은 CheckBeginInvokeOnUI (액션 조치)이 상황을 자동으로 처리 GalaSoft.MvvmLight.Threading.DispatcherHelper 클래스의 방법을 사용할 수 있습니다.

GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
{ 
    Gui.Property = SomeNewValue; 
}); 



편집 : 다음 코드는 MVVM 빛의 DispatcherHelper 클래스를 기반으로

툴킷 - link


그러나 MVVM Light (은 멋진 방법인데)를 사용하고 싶지 않다면 다음과 같이 시도해 볼 수 있습니다 (죄송합니다.이 기능이 작동하는지 확인할 수 없습니다. 윈도우 8) :

var dispatcher = Window.Current.Dispatcher; 

if (dispatcher.HasThreadAccess) 
    UIUpdateMethod(); 
else dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => UIUpdateMethod();); 


다음과 같은 별도의 클래스에서이 논리를 넣어 더 좋은 것 :

using System; 
using Windows.UI.Core; 
using Windows.UI.Xaml; 

namespace MyProject.Threading 
{ 
    public static class DispatcherHelper 
    { 
     public static CoreDispatcher UIDispatcher { get; private set; } 

     public static void CheckBeginInvokeOnUI(Action action) 
     { 
      if (UIDispatcher.HasThreadAccess) 
       action(); 
      else UIDispatcher.RunAsync(CoreDispatcherPriority.Normal, 
             () => action()); 
     } 

     static DispatcherHelper() 
     { 
      if (UIDispatcher != null) 
       return; 
      else UIDispatcher = Window.Current.Dispatcher; 
     } 
    } 
} 


그런 다음 당신은 그것을 좋아 사용할 수 있습니다

DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod()); 
+2

제 생각 엔이 방법이 효과적 일지 모르지만 제 3 자 라이브러리가 필요없는 솔루션을 알고 있다면 좋을 것입니다. – Nilzor

+0

댓글을 편집하여 확인해보십시오. – Oleg

+0

고마워요. 나는 Window.Current.Dispatcher.HasThreadAccess bool이 열쇠라고 생각합니다. – Nilzor

3

CoreApplication.Window를 통해 기본 UI 스레드에 액세스 할 수 있습니다.

if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess) 
      { 
       DoStuff(); 
      } 
      else 
      { 
       await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
       { 
        DoStuff(); 
       }); 
      } 
관련 문제