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

时间:2015-08-20 02:13:23

标签: c# multithreading windows-10 uwp

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

任何人都知道怎么做?

编辑:调度员在功能上可以被调用" UI线程上的async很好 - 但是,我真的不知道这是不是一个好主意 - 尝试通过调度程序从主线程调用主线程。如果有人有理由这是好还是坏,这也有助于回答这个问题。如果没有理由不在主线程上使用调度员,那么我猜没有问题。

2 个答案:

答案 0 :(得分:11)

我找到了解决方案......

CoreDispatcher.HasThreadAccess返回一个bool,指示您是否在UI线程上。

答案 1 :(得分:0)

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

可以使用Core Dispatcher CoreWindow.GetForCurrentThread().DispatcherWindows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher来访问Main UI线程

下面是一个实现Core Dispatcher并测试调用线程是否为Main UI Thread的类。如果是这样,它将调用该动作,否则调用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); };
        }
    }

上面的类可以这样使用:

// 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);
    }