一个解决在非UI线程中访问UI 异常的小方法
2018-06-23 22:30:12来源:未知 阅读 ()
写 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(); }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- jQuery异步提交表单的两种方式 2020-03-12
- 默认让页面的第一个控件选中的javascript代码 2020-02-20
- vue-cli中打包图片路径错误的解决方法 2020-01-17
- BootStrap 标题设置跨行无效的解决方法 2020-01-17
- textarea不能通过maxlength属性来限制字数的解决方法 2019-12-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash