WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面。幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法。以下是代码:

public static SynchronizationContext s_SC = Synchronization.Current; //主窗口类的静态成员
 
在App类中:
static volatile int s_nMainThreadID = Thread.CurrentThread.ManagedThreadId; //这个变量保存主线程ID(UI线程),为下面的属性服务,注意volatile修饰符,如果不用的话,在Release版本的程序可能会出错。
//这个属性表示当前执行线程是否在主线程中运行
public static bool IsRunInMainThread { get { return Thread.CurrentThread.ManagedThreadId == s_nMainThreadID;}}
 
//这个函数用于设置UI界面上的某个元素
public void SetText(string strText)
{
  if (!App.IsRunInMainThread)
  {
    s_SC.Post(oo => { SetText(strText); }, null); //可以使用Post也可以使用Send
    return;
  }
  textBlock1.Text = strText;
}
 
//这个函数用于从UI界面的元素获取内容
public string GetText()
{
  if (!App.IsRunInMainThread)
  {
    string str = null;
    s_SC.Send(oo => { str = GetText(); }, null);   //必须要使用Send
    return str;
  }
  return textBlock1.Text;
}
 
 
说明:虽然在主线程,也可以使用SynchronizationContext来更新界面,但那样做会导致性能大幅下降。例如以下两句语句的性能差距大约是15倍(假设都在主线程调用):
textBlock1.Text = "Hello";               //执行100万次用时1秒
s_SC.Send(oo => { textBlock1.Text = "Hello"; }, null);   //执行100万次用时15秒
所以,每次执行界面更新函数时,判断是否在主线程执行是必要的。

一种WPF在后台线程更新UI界面的简便方法的更多相关文章

  1. WPF 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/bdbw2012/articles/3777594.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在 ...

  2. Winform非UI线程更新UI界面的各种方法小结

    我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...

  3. 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...

  4. C# 后台线程更新UI控件

    /********************************************************************************* * C# 后台线程更新UI控件 * ...

  5. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  6. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  7. Python+PyQT5的子线程更新UI界面的实例《新手必学》

    今天小编就为大家分享一篇Python+PyQT5的子线程更新UI界面的实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧子线程里是不能更新UI界面的,在移动端方面.Android的U ...

  8. C#子线程更新UI控件的方法总结

    http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...

  9. WPF后台线程更新UI

    0.讲点废话 最近在做一个文件搜索的小软件,当文件多时,界面会出现假死的状况,于是乎想到另外开一个后台线程,更新界面上的ListView,但是却出现我下面的问题. 1.后台线程问题 2年前写过一个软件 ...

随机推荐

  1. Servlet之异常处理

    当一个 Servlet 抛出一个异常时,Web 容器在使用了exception-type 元素的 web.xml 中搜索与抛出异常类型相匹配的配置. 前提是必须在 web.xml 中使用 error- ...

  2. java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

    一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...

  3. linux中的网络通信指令

    1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...

  4. sharepoint adfs Adding Claims to an Existing Token Issuer in SharePoint 2010

    转载链接 http://www.theidentityguy.com/articles/2010/10/19/adding-claims-to-an-existing-token-issuer-i ...

  5. numpy教程:快速傅里叶变换模块numpy.fft

    http://blog.csdn.net/pipisorry/article/details/51050297 快速傅里叶变换 NumPy中,fft模块提供了快速傅里叶变换的功能.在这个模块中,许多函 ...

  6. Java-IO之超类OutputStream

    图中我们可以看出,以字节为单位的输出流的公共父类是OutputStream: 从中我们可以看出,以字节为单位的输出流的公共父类是OutputStream: (1)OutputStream是以字节为单位 ...

  7. iOS中 通知中心Text (实例)

    指定根视图 self.window.rootViewController = [RootViewController new]; 方法实现: #import "RootViewControl ...

  8. 《java入门第一季》之网络编程初探

    由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ...

  9. 从JDK源码角度看并发锁的优化

    在CLH锁核心思想的影响下,JDK并发包以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点的结构与节点等待机 ...

  10. 海量数据挖掘MMDS week3:流算法Stream Algorithms

    http://blog.csdn.net/pipisorry/article/details/49183379 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...