在.NET中,您有System.Threading.Thread.IsBackground
。
在WinRT / Metro中是否有一些相同的内容?
我有一个更改UI属性的方法,我想确定是否需要将执行分派给UI线程运行时。
答案 0 :(得分:16)
好吧,如果您在应用中使用 MVVM Light Toolkit ,则可以使用 GalaSoft.MvvmLight.Threading的 CheckBeginInvokeOnUI(动作操作)方法。 DispatcherHelper 类自动处理这种情况。
GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Gui.Property = SomeNewValue;
});
修改强>
以下代码基于 MVVM Light Toolkit 的 DispatcherHelper 类 - link
但是如果你不想使用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());
答案 1 :(得分:3)
您可以通过CoreApplication.Window访问主ui线程,例如
if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess)
{
DoStuff();
}
else
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
DoStuff();
});
}