一种WPF在后台线程更新UI界面的简便方法

Posted Fixing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种WPF在后台线程更新UI界面的简便方法相关的知识,希望对你有一定的参考价值。

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

public static SynchronizationContext s_SC = Synchronization.Current; //主窗口类的静态成员
 
在App类中:
static Thread s_MainThread = Thread.CurrentThread; //这个变量保存主线程(UI线程),为下面的属性服务
//这个属性表示当前执行线程是否在主线程中运行
public static bool IsRunInMainThread { get { return Thread.CurrentThread == s_MainThread;}}
 
//这个函数用于设置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;
}
 
无论在主线程还是后台线程调用GetText和SetText函数都没有问题。

以上是关于一种WPF在后台线程更新UI界面的简便方法的主要内容,如果未能解决你的问题,请参考以下文章

从后台线程更新 UI 是一种不好的做法,为啥? [关闭]

WPF:在后台不断更新 UI

多线程任务更新 1 个进度条 - UI C# WPF

WPF 简单判断主线程界面是否卡顿的方法

WPF 简单判断主线程界面是否卡顿的方法

WPF 简单判断主线程界面是否卡顿的方法