如何判断我当前的线程是否是 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().Dispatcher
或 Windows.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);
}
我正在为 UWP 开发一个用户控件,它会在某些调用时更新它的一些视觉效果。但是,由于核心 .NET 库已经转移并且线程 类 已被严重削减,如果调用线程是 [=18],我不知道如何从用户控件中的方法识别=] 线程,所以它知道是否使用调度程序来更改依赖项 属性.
有人知道怎么做吗?
编辑:调度程序在功能上可以 "invoked" 在 UI 线程上异步正常 - 但是,我真的不知道这是否是个好主意 - 尝试在主线程上调用通过调度程序从主线程线程。如果有人有理由认为这是好的或坏的,那也将有助于回答这个问题。如果没有理由不在主线程上使用调度程序,那么我想没有问题。
我找到了解决方案...
CoreDispatcher.HasThreadAccess returns 一个布尔值,指示您是否在 UI 线程上。
我儿子刚遇到这个问题,所以我想我会添加一个更新的答案。
可以使用 Core Dispatcher CoreWindow.GetForCurrentThread().Dispatcher
或 Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher
下面是一个 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);
}