C#中关于Dispatcher中Invoke和BeginInvoke的总结

前言

在WPF(Framework框架)中关于Dispatcher的总结

一、对于线程的理解

首先,对于WPF应用程序,用于接受输入、处理事件的线程成为UI线程,在UI线程中有一个DIspatcher对象(this.Dispatcher),该对象的作用在于管理UI线程每个执行的工作项,根据每个工作的优先级排队,优先级可以设置。

Dispatcher提供了两个注册工作项的方法:Invoke和BeginInvoke

Invoke方法:这个是同步调用,就是要执行完这个注册的工作项(执行委托)才会返回

BeginInvoke方法: 这是个异步调用,即可返回

二、解决问题

我们在设计程序的时候会涉及到某些耗时操作会占用主线程,早成程序卡假死,用户体验感差,这种问题我们就要用到子线程去处理耗时操作,而子线程不能直接修改主线程(UI线程)中创建的对象,必须通过向UI线程中的Dispatcher注册工作项来完成。
        例:加载进度条,耗时操作,放在子线程中进行操作

三、项目代码


    
        
        
        
            0
        
        
        
    
 public MainWindow()
        {
            InitializeComponent();
            this.btnStart.Click += BtnStart_Click;
            this.btnCancel.Click += BtnCancel_Click;
        }

        Thread threadStart; //声明线程
        private void BtnStart_Click(object sender, RoutedEventArgs e)
        {
            threadStart = new Thread(DoTask); //创建线程,去更新加载进度条信息及加载数具体数字
            threadStart.Start();
        }
        private void DoTask()
        {
            int maxValue = 100;
            for(int i =0; i

其中,在线程中的委托事件DoTask()中是在开启子线程中操作的,

this.Dispatcher.Invoke((Action)delegate ()
{
    MessageBox.Show("加载完成");        //主线程弹窗,必须关掉MessageBox才能后续操作
});

this.Dispatcher.Invoke((Action)delegate (),又回到主线程的同步调用,(必须关闭掉MessageBox才能回到主线程),才能点Cancel按钮/拖动主界面;

若代码改为异步调用, this.Dispatcher.BeginInvoke((Action)delegate ()

this.Dispatcher.BeginInvoke((Action)delegate ()
{
    MessageBox.Show("加载完成");        //主线程弹窗,必须关掉MessageBox才能后续操作
});

则可以点击Cancel按钮/拖动主界面;

四、总结

Invoke方法:这个是同步调用,就是要执行完这个注册的工作项(执行委托)才会返回

BeginInvoke方法: 这是个异步调用,即可返回


 

你可能感兴趣的:(wpf,.net)