一个解决在非UI线程中访问UI异常的小方法

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

写 WPF 的童鞋可能都会碰到 在非UI线程中访问 UI 异常的问题。这是为了防止数据不一致做的安全限制。

子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦。

接下来,我们推出一个可以称之为框架的解决方案(拍砖的时候轻点)。

一:解决判断当前线程是主线成的问题在 C# 中 微软好像没有给出直接判断当前线程是否是主线程的方案,至少我是没找到。

如果您有更好的解决方案请留言哦!!!!

///<summary>///Lyx 线程框架 类///</summary>publicclassLyxThreadFrame

{///<summary>///主线程 签名///</summary>publicconststringMainThreadIdiograph ="Main Thread";///<summary>///初始化 线程检测框架///<para>请在UI(主)线程下初始化</para>///</summary>publicstaticvoidInit()

{varthread =System.Threading.Thread.CurrentThread;

thread.Name=MainThreadIdiograph;

}

}

我的解决方案是,在程序启动的时候先给主线程命名

publicpartialclassApp :application{PRotectedoverridevoidOnStartup(StartupEventArgs e)

{

LyxThreadFrame.Init();base.OnStartup(e);

}

}

我会重写 Application 类的 OnStartup() 方法,在这个方法中去初始化当前框架

OnStartup() WPF 程序启动的入口点,主窗口的创建就是在这里了。

///<summary>///线程 扩展类///</summary>publicstaticclassThreadExtension

{///<summary>///当前线程是否是主线程///</summary>publicstaticboolIsMainThread(thisThread thread)

{if(thread ==null)

{thrownewArgumentNullException("thread");

}if(thread.Name ==null)

{returnfalse;

}returnthread.Name.Equals(LyxThreadFrame.MainThreadIdiograph);

}

}

扩展线程类,用于判断当前方法是否是主线程,判断下指定线程是否是哥当初赏赐了名字的那个线程。

好了,到这里就能判断当前线程是否是主线程了。

二:让你的UI 访问代码在UI(主)线程下执行///<summary>///委托 扩展类///</summary>publicstaticclassDelegateExtension

{///<summary>///在UI(主)线程中执行///</summary>publicstaticobjectSafetyInvoke(thisDelegate dele,paramsobject[] param)

{varthread =System.Threading.Thread.CurrentThread;if(thread.IsMainThread())

{returndele.DynamicInvoke(param);

}else{returnApplication.Current.Dispatcher.Invoke(dele, param);

}

}

}

在这里我们扩展了 Delegate 这里有个 Application 类,我们程序中的 App 就是继承了这个。它是程序的入口点。

这样我们就创建了一个安全的 访问UI的环境。

示例:

publicvoidHello()

{

var action =newAction(() =>{//更新UI});

action.SafetyInvoke();

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航