国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

一個解決在非UI線程中訪問UI異常的小方法

2019-11-14 16:15:45
字體:
來源:轉載
供稿:網友

寫 WPF 的童鞋可能都會碰到 在非UI線程中訪問 UI 異常的問題。這是為了防止數據不一致做的安全限制。

子線程中更新UI還要交給主線程更新,引用滿天飛,實在是麻煩。

接下來,我們推出一個可以稱之為框架的解決方案(拍磚的時候輕點)。

 

一:解決判斷當前線程是主線成的問題

在 C# 中 微軟好像沒有給出直接判斷當前線程是否是主線程的方案,至少我是沒找到。

如果您有更好的解決方案請留言哦!!!!

/// <summary>/// Lyx 線程框架 類/// </summary>public class LyxThreadFrame{    /// <summary>    /// 主線程 簽名    /// </summary>    public const string MainThreadIdiograph = "Main Thread";    /// <summary>    /// 初始化 線程檢測框架    /// <para>請在UI(主)線程下初始化</para>    /// </summary>    public static void Init()    {        var thread = System.Threading.Thread.CurrentThread;        thread.Name = MainThreadIdiograph;    }}

我的解決方案是,在程序啟動的時候先給主線程命名

 

public partial class App : application{    PRotected override void OnStartup(StartupEventArgs e)    {        LyxThreadFrame.Init();        base.OnStartup(e);    }}

我會重寫 Application 類的 OnStartup() 方法,在這個方法中去初始化當前框架

OnStartup() WPF 程序啟動的入口點,主窗口的創建就是在這里了。

 

/// <summary>/// 線程 擴展類/// </summary>public static class ThreadExtension{    /// <summary>    /// 當前線程是否是主線程    /// </summary>    public static bool IsMainThread(this Thread thread)    {        if (thread == null)        {            throw new ArgumentNullException("thread");        }        if (thread.Name == null)        {            return false;        }        return thread.Name.Equals(LyxThreadFrame.MainThreadIdiograph);    }}

擴展線程類,用于判斷當前方法是否是主線程,判斷下指定線程是否是哥當初賞賜了名字的那個線程。

好了,到這里就能判斷當前線程是否是主線程了。

 

二:讓你的UI 訪問代碼在UI(主)線程下執行

/// <summary>/// 委托 擴展類/// </summary>public static class DelegateExtension{    /// <summary>    /// 在UI(主)線程中執行    /// </summary>    public static object SafetyInvoke(this Delegate dele, params object[] param)    {        var thread = System.Threading.Thread.CurrentThread;        if (thread.IsMainThread())        {            return dele.DynamicInvoke(param);        }        else        {            return Application.Current.Dispatcher.Invoke(dele, param);        }    }}

在這里我們擴展了 Delegate 這里有個 Application 類,我們程序中的 App 就是繼承了這個。它是程序的入口點。 

這樣我們就創建了一個安全的 訪問UI的環境。

 

示例:

public void Hello(){    var action = new Action(() =>     {        //更新UI    });
  action.SafetyInvoke();}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 溧阳市| 西乌珠穆沁旗| 南江县| 手机| 禹城市| 东兰县| 惠州市| 虎林市| 米易县| 塔河县| 四会市| 三穗县| 加查县| 柞水县| 喀喇| 额尔古纳市| 老河口市| 临颍县| 逊克县| 恩平市| 南岸区| 唐海县| 丹寨县| 林西县| 镇远县| 新建县| 炉霍县| 南漳县| 遵化市| 资兴市| 三江| 拜泉县| 莱阳市| 铜梁县| 资源县| 陆川县| 闸北区| 尖扎县| 咸丰县| 黔西县| 辛集市|