如何确定是否需要在WinRT / Metro中调度到UI线程?

时间:2012-08-16 09:08:19

标签: .net microsoft-metro windows-runtime

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

在WinRT / Metro中是否有一些相同的内容?

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

2 个答案:

答案 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();
                });
            }