WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync

首先更深入的原理知识请移步:https://blog.csdn.net/WPwalter/article/details/78093917

这里主要用上几个实例。总结一下:

1.BeginInvoke和InvokeAsync原理一致,可取得一致的结果,用InvokeAsync会更实用方便,因为可以直接用上Action和Fun方法。

2.Invoke会阻塞线程,直到Invoke里的代码完成,InvokeAsync和BeginInvoke会直接运行后面的代码。

来看一个简单的实例:

private void btn_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(DoSomeThing);
            t.Start();

            lable.Content= "1";
            this.Dispatcher.Invoke(() => { lable.Content += "2";Thread.Sleep(2000); });
            
            lable.Content += "3";
            
                

        }

        private void DoSomeThing()
        {
            for(int i=0;i<10;i++)
            {
                this.Dispatcher.Invoke(()=> { lable.Content += i.ToString(); });
                Thread.Sleep(1000);
            }
        }

结果是:

可以发现,先执行Invoke,然后执行Thread里的内容。

接下来,把Invoke换成InvokeAsync。

private void btn_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(DoSomeThing);
            t.Start();

            lable.Content= "1";
            this.Dispatcher.InvokeAsync(() => { lable.Content += "2";Thread.Sleep(2000); });
            lable.Content += "3";
        }

会发现结果变了。3在前,2在后,也就是说先执行了InvokeAsync。

接着再把DoSomeThing的Invoke也改成InvokeAsync,最后会发现结果中0变成了1,这是因为这里的进程在排队,先结束了btn_click里的InvokeAsync,然后再来执行DoSomeThing里的InvokeAsync,而此时i的值已经变成了1。

private void DoSomeThing()
        {
            for(int i=0;i<10;i++)
            {
                this.Dispatcher.InvokeAsync(()=> { lable.Content += i.ToString(); });
                Thread.Sleep(1000);
            }
        }

你可能感兴趣的:(wpf)