簡體   English   中英

如何判斷當前線程是否為 UI 線程?

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

我正在為 UWP 開發一個用戶控件,它會在某些調用時更新它的一些視覺效果。 但是,由於核心.NET庫已經轉移並且線程類被嚴重削減,我不知道如何從用戶控件中的方法中識別調用線程是否為UI線程所以它知道是否使用調度程序更改依賴項屬性。

有人知道怎么做嗎?

編輯:調度程序功能上可以在 UI 線程上“調用”異步罰款 - 但是,我真的不知道這是否是一個好主意 - 嘗試通過調度程序從主線程調用主線程。 如果有人有理由認為這是好是壞,那也有助於回答這個問題。 如果沒有理由不在主線程上使用調度程序,那么我想沒有問題。

我找到了解決方案...

CoreDispatcher.HasThreadAccess返回一個布爾值,指示您是否在 UI 線程上。

我兒子剛剛遇到這個問題,所以我想我會添加一個更新的答案。

可以使用 Core Dispatcher CoreWindow.GetForCurrentThread().DispatcherWindows.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM