首页 > 其他分享 >WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher

WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher

时间:2022-11-21 15:11:28浏览次数:70  
标签:不卡 Thread TimeSpan Sleep 操作界面 线程 FromSeconds WPF Dispatcher

经常要考虑的,后台的耗时操作不要卡死主界面的问题。

WPF 后台线程操作界面元素不卡UI界面线程 Dispatcher_WPF

<StackPanel VerticalAlignment="Center">
<Label x:Name="lblHello">欢迎你光临WPF的世界!</Label>
<Button Name="btnThd" Click="btnThd_Click" >多线程同步调用</Button>
<Button Name="btnAppBeginInvoke" Click="btnAppBeginInvoke_Click" >BeginInvoke 异步调用</Button>
</StackPanel>

Behind Code:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void ModifyUI()
{
//// 模拟一些工作正在进行
//Thread.Sleep(TimeSpan.FromSeconds(2));
//lblHello.Content = "欢迎你光临WPF的世界,Dispatcher";

// 模拟一些工作正在进行
Thread.Sleep(TimeSpan.FromSeconds(3));
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate ()
{
lblHello.Content = "欢迎你光临WPF的世界,Dispatche 同步方法 !!";
});
}

private void btnThd_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(ModifyUI);
thread.Start();
}

private void btnAppBeginInvoke_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(3));
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new Action(() =>
{
//Thread.Sleep(TimeSpan.FromSeconds(3)); // 放这里还是会卡 UI 界面线程
this.lblHello.Content = "欢迎你光临WPF的世界,Dispatche 异步方法!!" + DateTime.Now.ToString();
}));
}).Start();
}
}

这样调用,是不会卡主界面的。






标签:不卡,Thread,TimeSpan,Sleep,操作界面,线程,FromSeconds,WPF,Dispatcher
From: https://blog.51cto.com/u_15698411/5873910

相关文章

  • C++多线程
    c++多线程多线程其实非常简单多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程......
  • 饿汉模式,懒汉模式线程安全问题
    饿汉模式:上来不管三七二十一直接创建对象再说。饿汉模式创建方式:1.先创建一个私有的构造函数(防止其它地方直接实例化)2.定义私有变量3.提供公共的获取实例的方法pub......
  • 线程的私有空间
    线程内部的全局变量如果需要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量,这就需要新的机制来实现,我们称之为Staticmemorylocaltoathread(线程局......
  • 【Java】JDK5.0新增的创建多线程的方式:实现Callable接口,使用线程池
    1.实现Callable接口方式和实现Runnable接口相比call()可以有返回值。call()可以抛出异常,被外面的操作捕获,获取异常信息。Callable是支持泛型的。实现Callable接口......
  • 第四章-线程间的同步操作 4-2 等待一次性事件
    Waitingforone-offeventswithfutures#include<future>1.std::futurec++标准库使用了一种叫做std::future的东西来模拟一次性等待事件(one-offevent)。(见末尾......
  • java.lang.IllegalThreadStateException 线程运行报错
    写程序线程再运行第二遍的时候报java.lang.IllegalThreadStateException。发现一个Thread不能重复用start方法。解决方法:1、将extendsThread线程类改成implementsRunnabl......
  • 为仿真器添加eCos多线程调试支持,GDBServer Extender 0.0.1 使用说明
    可以使用RedBoot或者仿真器调试eCos系统,RedBoot集成的GDBStubs已经支持eCos的多线程调试,使用GDB命令infothreads就可以读取当前的线程状态。但是使用仿真器时,由于仿真器不......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    (目录)一、说明RejectedExecutionHandler当线程池已经被关闭,或者任务数超过maximumPoolSize+workQueue时执行拒绝策略ThreadPoolExecutor.AbortPolicy默认拒绝策略,丢......
  • 线程与GC
    托管线程在GC期间从是否可以访问托管堆上的对象来说有两种模式1.抢占模式,,不可以访问托管堆上的对象2.合作模式,,可以自由访问托管堆上的对象托管线程在GC期间会有两种模......
  • java——线程同步机制——解决线程安全问题——Lock锁
    解决线程安全问题——Lock锁解决线程安全问题的三种方案:使用Lock锁java.util.concurrent.locks.Lock接口Lock实现提供了比使用synchronized方法和语句可获得的更广......