本篇文章主要介绍了"一个解决在其它的线程中访问UI 异常的小方法",主要涉及到方面的内容,对于.NETjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
写 WPF 的童鞋可能都会碰到 在子线程中访问 UI 异常的问题。这是为了防止数据不一致做的安全限制。子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦...
写 WPF 的童鞋可能都会碰到 在子线程中访问 UI 异常的问题。这是为了防止数据不一致做的安全限制。
子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦。
接下来,我们推出一个可以称之为框架的解决方案(拍砖的时候轻点)。
一:解决判断当前线程是主线成的问题
在 C# 中 微软好像没有给出直接判断当前线程是否是主线程的方案,至少我是没找到。
///
/// Lyx 线程框架 类
///
public class LyxThreadFrame
{
///
/// 主线程 签名
///
public const string MainThreadIdiograph = "Main Thread";
///
/// 初始化 线程检测框架
/// 请在UI(主)线程下初始化
///
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 程序启动的入口点,主窗口的创建就是在这里了。
///
/// 线程 扩展类
///
public static class ThreadExtension
{
///
/// 当前线程是否是主线程
///
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(主)线程下执行
///
/// 委托 扩展类
///
public static class DelegateExtension
{
///
/// 在UI(主)线程中执行
///
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 类在.Net 下是老子的身份,所有委托均继承至它。 在这里我们扩展了 Delegate
这里有个 Application 类,我们程序中的 App 就是基础了这个。它是程序的入口点。
这样我们就创建了一个安全的 访问UI的环境
示例:
public void Hello()
{
var action = new Action(() =>
{
//更新UI
});
action.SafetyInvoke();
}
以上就介绍了一个解决在其它的线程中访问UI 异常的小方法,包括了方面的内容,希望对.NETjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_103630.html