• WPF学习笔记2——WPF子线程更新UI


    WPF学习笔记2——WPF子线程更新UI

    1.Dispatcher

    WPF应用程序的主线程负责创建UI界面、接收输入、处理事件等任务,在开发中常用子线程处理一些耗时的操作(为了主线程能及时响应,防止假死),但是子线程是不能直接更新UI界面。Dispatcher的作用是管理线程工作项队列,我们可以使用Dispatcher更新UI界面。

    2.使用Dispatcher更新UI界面

    下面是一个简单的例子,在子线程直接更新主线程维护的界面。

    using System;
    using System.Threading;
    using System.Windows;
    
    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Thread thread = new Thread(ModifyLabel);
                lblShow.Content = "开始工作";
                thread.Start();
            }
    
            private void ModifyLabel()
            {
                // 模拟工作正在进行
                Thread.Sleep(TimeSpan.FromSeconds(2));
                lblShow.Content = "结束工作";
            }
        }
    }

    错误截图:

    在子线程中使用Dispatcher.BeginInvoke()方法更新UI。

    using System;
    using System.Threading;
    using System.Windows;
    
    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Thread thread = new Thread(ModifyLabel);
                lblShow.Content = "开始工作";
                thread.Start();
            }
    
            private void ModifyLabel()
            {
                // 模拟工作正在进行
                Thread.Sleep(TimeSpan.FromSeconds(2));
    
                //子线程更新UI线程可以使用Dispatcher.BeginInvoke()或者Invoke()方法。
                this.Dispatcher.BeginInvoke(new Action(() =>
                {
                    //更新操作
                    lblShow.Content = "结束工作";
                }));
            }
        }
    }

    子线程更新UI可以使用Dispatcher.BeginInvoke()或者Invoke()方法,Dispatcher.Invoke()是同步执行

  • 相关阅读:
    C++调用外部应用程序
    SVN文件加锁
    vs ComboBox显示多行
    __slots__ Python Class限制添加属性
    Python数据分析之pandas学习
    整理Lua和Unity和Lua交互文章链接
    [整理]Unity3D游戏开发之Lua
    ping telnet ssh netstat
    java rpc
    css 手机适配
  • 原文地址:https://www.cnblogs.com/nmmking/p/13257429.html
Copyright © 2020-2023  润新知