多线程环境的UI控件属性更新

Posted guangfengli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程环境的UI控件属性更新相关的知识,希望对你有一定的参考价值。

Winform:

public delegate void UpadataTextCallBack(string str,TextBox text);
public void UpadtaText(string str, TextBox text)
{
  if (text.InvokeRequired)
  {
    UpadataTextCallBack upadataTextCallBack = UpadtaText;
    text.Invoke(upadataTextCallBack, new object[] {str, text});
  }
  else
  {
    text.Text = str;
  }
}

  

  WPF:

然而在WPF下,并不支持Control.InvokeRequired。需要调用Dispatcher.Invoke()方法

在 WPF 中,只有创建 DispatcherObject 的线程才能访问该对象。例如,一个从主 UI 线程派生的后台线程不能更新在该 UI 线程上创建的 Button的内容。为了使该后台线程能够访问 Button 的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。它使用Invoke 或BeginInvoke完成。Invoke是同步,BeginInvoke 是异步。该操作将按指定的 DispatcherPriority 添加到 Dispatcher 的事件队列中。

 

public delegate void UpadataTextCallBack(string str,TextBox text);

public void UpadtaText(string str, TextBox text)
{
if (!Dispatcher.CheckAccess())
{
  Dispatcher.Invoke(DispatcherPriority.Send, new setListTextCallBack(UpadtaText),str,text);
  return;
}   text.Text = str; 
}

  

以上是关于多线程环境的UI控件属性更新的主要内容,如果未能解决你的问题,请参考以下文章

winform中如何在多线程中更新UI控件--ListView实时显示执行信息

富客户端 wpf, Winform 多线程更新UI控件

基础多线程更新窗体UI的若干方法

网络操作不能直接写在主线程中 以及 为什么不能在子线程中更新UI控件的属性

C# winform 多线程更新数据,UI卡顿现象。

oc 多线程UI更新