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

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

时间:2022-11-12 17:44:05浏览次数:78  
标签:不卡 Thread TimeSpan 操作界面 线程 FromSeconds WPF Dispatcher

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

<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>
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();
    }
}

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




参考:

https://www.cnblogs.com/chillsrc/p/4482691.html

标签:不卡,Thread,TimeSpan,操作界面,线程,FromSeconds,WPF,Dispatcher
From: https://www.cnblogs.com/huvjie/p/16884256.html

相关文章

  • 解决线程安全问题二
    packagedeep;//同步方法classWindow3implementsRunnable{privateintticket=100;publicvoidrun(){while(true){show();......
  • 如何解决多线程安全问题一
    packagedeep;//问题:出现重票和错票(即线程安全问题)//原因:某个线程操作车票的过程中,未完成时其它线程就参与进来,也操作//如何解决:a操作完才允许其它线程加入//在java中通过......
  • 线程、 进程、 协程
    1.多线程(单线程、多线程)#线程、进程#线程是执行单位进程->公司线程->员工#进程是资源单位(每一个进程里面至少有一个线程)#单线程deffunc():for......
  • 线程创建
    线程创建继承Thread类方法1.自定义线程继承Thread类2.重写run()方法,编写线程执行体3.创建线程对象,调用start()方法启动线程注意:线程不一定立即执行,CPU安排调度pack......
  • 线程协作(生产者消费者模式)
    线程协作(生产者消费者模式)线程通信1.Java提供了几个方法解决线程之间的通信问题​。wait()表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁​......
  • 线程同步(多个线程操作同一个资源)
    线程同步(多个线程操作同一个资源)核心概念线程是独立的执行路径在下线程运行时,即使没有自己创建线程,后台也会有多个线程,如:主线程,gc线程;main()称之为主线程,为系统的入......
  • Java多线程中锁的理解与使用
    参考:https://blog.csdn.net/tyyj90/article/details/782360531.简介锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如synchronized和ReentrantLock等)......
  • C# 使用CancellationTokenSource取消多线程
    原文网址:https://blog.csdn.net/xwnxwn/article/details/115670973如下:我们点击一个按钮开启线程,然后点击取消按钮取消该线程的执行    CancellationTokenSourcect......
  • 统计开始目录及其子目录下的指定类型文件中的单词(使用多线程、并发多线程(mappedReduce
    #include<QList>#include<QMap>#include<QTextStream>#include<QString>#include<QStringList>#include<QDir>#include<QElapsedTimer>#include<QApplicati......
  • 定时任务 & 定时线程池
    定时线程池使用场景:1.分布式锁-redis2.springCloud-服务注册与发现中心ScheduledThreadPoolExecutor它用来处理延时任务或定时任务。   它接收Schduled......