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

Nil*_*zor 6 .net microsoft-metro windows-runtime

在.NET中你有System.Threading.Thread.IsBackground.

在WinRT/Metro中是否有相同的功能?

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

Ole*_*leg 16

好吧,如果你在你的应用程序中使用MVVM Light Toolkit,你可以使用GalaSoft.MvvmLight.Threading.DispatcherHelper类的CheckBeginInvokeOnUI(Action action)方法自动处理这种情况.

GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
    Gui.Property = SomeNewValue;
});
Run Code Online (Sandbox Code Playgroud)



编辑:

以下代码基于DispatcherHelper类的MVVM Light Toolkit - link


但是如果你不想使用MVVM Light(顺便说一下这很酷),你可以试试这样的东西(抱歉,无法检查这是否有效,没有Windows 8):

var dispatcher = Window.Current.Dispatcher;

if (dispatcher.HasThreadAccess)
    UIUpdateMethod();
else dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => UIUpdateMethod(););
Run Code Online (Sandbox Code Playgroud)


将这个逻辑放在单独的类中会更好:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


然后你就可以使用它:

DispatherHelper.CheckBeginInvokeOnUI(() => UIUpdateMethod());
Run Code Online (Sandbox Code Playgroud)

  • 我想这很有用,但如果有人知道不需要第三方库的解决方案那就太好了. (2认同)