[英]How do I tell if my current thread is the UI thread?
我正在為 UWP 開發一個用戶控件,它會在某些調用時更新它的一些視覺效果。 但是,由於核心.NET庫已經轉移並且線程類被嚴重削減,我不知道如何從用戶控件中的方法中識別調用線程是否為UI線程所以它知道是否使用調度程序更改依賴項屬性。
有人知道怎么做嗎?
編輯:調度程序功能上可以在 UI 線程上“調用”異步罰款 - 但是,我真的不知道這是否是一個好主意 - 嘗試通過調度程序從主線程調用主線程。 如果有人有理由認為這是好是壞,那也有助於回答這個問題。 如果沒有理由不在主線程上使用調度程序,那么我想沒有問題。
我找到了解決方案...
CoreDispatcher.HasThreadAccess返回一個布爾值,指示您是否在 UI 線程上。
我兒子剛剛遇到這個問題,所以我想我會添加一個更新的答案。
可以使用 Core Dispatcher CoreWindow.GetForCurrentThread().Dispatcher
或Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher
訪問主 UI 線程
下面是一個實現Core Dispatcher
並測試調用線程是否為主 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); };
}
}
上面的類可以這樣使用:
// 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.