在 .NET 中,您拥有System.Threading.Thread.IsBackground
.
WinRT/Metro 中是否有类似的功能?
我有一个更改 UI 属性的方法,我想确定是否需要将执行分派到 UI 线程运行时。
在 .NET 中,您拥有System.Threading.Thread.IsBackground
.
WinRT/Metro 中是否有类似的功能?
我有一个更改 UI 属性的方法,我想确定是否需要将执行分派到 UI 线程运行时。
好吧,如果您在应用程序中使用MVVM Light Toolkit,您可以使用GalaSoft.MvvmLight.Threading.DispatcherHelper类的CheckBeginInvokeOnUI(Action action)方法自动处理这种情况。
GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Gui.Property = SomeNewValue;
});
编辑:
以下代码基于MVVM Light Toolkit的DispatcherHelper类-链接
但是,如果您不想使用 MVVM Light(顺便说一句,这很酷),您可以尝试这样的事情(抱歉,无法检查这是否有效,没有 Windows 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();
});
}