如何判断我当前的线程是否是 UI 线程?

How do I tell if my current thread is the UI thread?

我正在为 UWP 开发一个用户控件,它会在某些调用时更新它的一些视觉效果。但是,由于核心 .NET 库已经转移并且线程 类 已被严重削减,如果调用线程是 [=18],我不知道如何从用户控件中的方法识别=] 线程,所以它知道是否使用调度程序来更改依赖项 属性.

有人知道怎么做吗?

编辑:调度程序在功能上可以 "invoked" 在 UI 线程上异步正常 - 但是,我真的不知道这是否是个好主意 - 尝试在主线程上调用通过调度程序从主线程线程。如果有人有理由认为这是好的或坏的,那也将有助于回答这个问题。如果没有理由不在主线程上使用调度程序,那么我想没有问题。

我找到了解决方案...

CoreDispatcher.HasThreadAccess returns 一个布尔值,指示您是否在 UI 线程上。

我儿子刚遇到这个问题,所以我想我会添加一个更新的答案。

可以使用 Core Dispatcher CoreWindow.GetForCurrentThread().DispatcherWindows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher

访问主 UI 线程

下面是一个 class 实现 Core Dispatcher 并测试调用线程是否是 Main UI 线程。如果是,它调用该操作,否则调用 Dispatcher.RunAsync 在主 UI 线程上执行它。

class Threading {

     private static CoreDispatcher Dispatcher => 
     Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;

     public static async void ThreadSafe(DispatchedHandler action)
        {
            // Calls Dispatcher.RunAsync to run a method on the Main UI Thread
            IAsyncAction UiThread(DispatchedHandler proc) => Dispatcher.RunAsync(CoreDispatcherPriority.Normal, proc);

            // Checks to see if this was called from the Main UI thread 
            // If we are in the Main UI thread then Invoke the action 
            // Otherwise: Send it to run in the Main Ui Thread.

            if (Dispatcher.HasThreadAccess) { action.Invoke(); } else { await UiThread(action); };
        }
    }

上面的class可以这样使用:

// Some event handler callback
private void SomeCallback(object sender)(){
    void line() => Frame.Navigate(typeof(PageName));
    Threading.ThreadSafe(line);
}

// Pass a handle to the control and a string to update it's text property
internal static void ChangeControlText(dynamic ctrl , string v)
    {
                void line() {ctrl.Text= v;}
                ThreadSafe(line);
    }