6

在 .NET 中,您拥有System.Threading.Thread.IsBackground.

WinRT/Metro 中是否有类似的功能?

我有一个更改 UI 属性的方法,我想确定是否需要将执行分派到 UI 线程运行时。

4

2 回答 2

16

好吧,如果您在应用程序中使用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());
于 2012-08-16T09:33:12.170 回答
3

您可以通过 CoreApplication.Window 访问主 ui 线程,例如

 if (CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess)
            {
                DoStuff();
            }
            else
            {
                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    DoStuff();
                });
            }
于 2012-09-18T14:24:39.693 回答