.NET에서 당신은 System.Threading.Thread.IsBackground
입니다.WinRT/Metro의 UI 스레드로 디스패치해야 하는지를 어떻게 결정합니까?
WinRT/Metro에는 이와 비슷한 기능이 있습니까?
UI 속성을 변경하는 메서드가 있는데 UI 스레드 런타임에 실행을 디스패치해야하는지 여부를 결정하고 싶습니다. 앱에서 MVVM Light Toolkit를 사용하는 경우
.NET에서 당신은 System.Threading.Thread.IsBackground
입니다.WinRT/Metro의 UI 스레드로 디스패치해야 하는지를 어떻게 결정합니까?
WinRT/Metro에는 이와 비슷한 기능이 있습니까?
UI 속성을 변경하는 메서드가 있는데 UI 스레드 런타임에 실행을 디스패치해야하는지 여부를 결정하고 싶습니다. 앱에서 MVVM Light Toolkit를 사용하는 경우
글쎄, 당신은 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());
CoreApplication.Window를 통해 기본 UI 스레드에 액세스 할 수 있습니다.
if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess)
{
DoStuff();
}
else
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
DoStuff();
});
}
제 생각 엔이 방법이 효과적 일지 모르지만 제 3 자 라이브러리가 필요없는 솔루션을 알고 있다면 좋을 것입니다. – Nilzor
댓글을 편집하여 확인해보십시오. – Oleg
고마워요. 나는 Window.Current.Dispatcher.HasThreadAccess bool이 열쇠라고 생각합니다. – Nilzor