我正在为UWP开发用户控件,并在某些调用时更新其部分视觉效果。但是,由于核心.NET库已被转移并且线程类已被严重削减,我不知道如何从用户控件中的方法中识别调用线程是否是UI线程,它知道是否使用调度程序来更改依赖项属性。
任何人都知道怎么做?
编辑:调度员在功能上可以被调用" UI线程上的async很好 - 但是,我真的不知道这是不是一个好主意 - 尝试通过调度程序从主线程调用主线程。如果有人有理由这是好还是坏,这也有助于回答这个问题。如果没有理由不在主线程上使用调度员,那么我猜没有问题。
答案 0 :(得分:11)
我找到了解决方案......
CoreDispatcher.HasThreadAccess返回一个bool,指示您是否在UI线程上。
答案 1 :(得分:0)
我儿子刚遇到这个问题,所以我想我应该添加一个更新的答案。
可以使用Core Dispatcher CoreWindow.GetForCurrentThread().Dispatcher
或Windows.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);
}